当前位置: 首页 > 知识库问答 >
问题:

S3拒绝带有预签名URL的浏览器PUT-它认为它们是GET

田权
2023-03-14

我正在尝试使用预签名的URL和PUT方法从浏览器(Chrome版本41.0)上传文件到S3。我正在服务器上正确生成预签名的URL,因为它在curl中运行良好:

curl-x PUT“content-type:”--data“junk”“https://mypresignedurl”

我现在尝试使用jQuery从浏览器上传

但我用的不是GET我用的是put。如果我检查Chrome的network选项卡,它会正确地将请求列表为PUT。那么为什么AWS会将浏览器PUT请求解释为GET,并拒绝它们呢?

(这似乎与CORS无关。我在我的bucket上设置了CORS,然后使用-h“origin:http://elsewhere.com”从CURL进行测试。我还尝试传递“type”而不是“method”。我尝试使用POST而不是PUT-即使这样AWS仍然将StringToSign列为get。我尝试了各种ContentTypes。FWIW,我的presignedURL上载逻辑在.NET的WPF应用程序中都能正常工作。)

共有1个答案

隆康平
2023-03-14

好的,开始工作了。我现在可以使用预签名的URL从浏览器上传。

让我感到困惑的是S3把我的put解释为get的问题。但这其实是错误的。为了解决权限问题,我在Chrome的网络选项卡中查了一下。在对S3的PUT请求之前,有一个对同一S3endpoint的OPTIONS请求。我单击此链接以获取更多信息,这时我看到signaturedoesnotmatch消息,其中包含 get... 但单击浏览器中的此链接导致浏览器尝试从S3获取资源。这不是你该做的。正在使用OPTIONS方法检索请求。如果您真的愿意,您可以使用curl-x OPTIONS...手动完成此操作,然后它会正确地列出如何访问此url。但不要在浏览器中点击它,否则浏览器将试图获取它,从而产生一个与您最初的PUT请求无关的无意义消息。

那为什么我一开始上传就出错了呢?结果是我将content-type留空。浏览器显然不喜欢这样,把它变成“,text/plain...”。另一方面,curl和.NET似乎可以使用空白的content-type,因此它们的行为存在差异。当我在服务器上和ajax上载中生成预签名URL时都使用了相同的content-type=“text/plain”时,一切正常。

 类似资料:
  • 我正试图用预签名的URL直接上传一个文件到S3 bucket,但在PUT请求上出现AccessDenied(403 Plibended)错误。 附注。忘了补充。我已经尝试添加和以及并且在本例中上载工作正常,但是如何限制上载的访问?它应该只适用于预签名的URL,对吗?

  • 标题说明一切。这是我的代码; 我使用节点强大的文件。 成功上传后,url变量返回s3 url,类似以下内容; 下面是我的参数 我错过了什么?

  • 我需要发布预签名URL,允许用户获取文件并将其放入特定的S3存储桶。我创建了一个IAM用户,并使用其密钥创建预签名URL,并在该用户中添加了一个嵌入的自定义策略(见下文)。当我使用生成的URL时,我的策略出现了一个AccessDenied错误。如果我向IAM用户添加FullS3Access策略,则可以使用相同的URL获取或放置文件,因此显然缺少我的自定义策略。它怎么了? 以下是我正在使用的不起作用

  • 我试图使用S3预签名的PUT url执行文档上传。我使用java AWSSDK(GeneratePresignedUrlRequest.java)生成url。此url生成代码位于AWS API网关后面的lambda函数中。 然而,当我在Postman中复制生成的url时,我遇到了以下错误 生成的url是“https:// 关于在生成url时需要更正的内容,有什么建议吗?

  • 好吧,问题很简单,但我不知道怎么做。我试着逐个检查两个元素,但这不是最好的方法。我有一组圆形物体。数组有位置字段X和Y。我想遍历数组,检查所有元素是否在一条线上(水平或垂直)。我如何通过数组检查圆心是否在同一条线上。 我试着做这样的事情,看看圆圈是否在同一条垂直线上,但我说它需要一个元素与邻居。

  • 问题内容: 我有Java Desktop应用程序,该应用程序在中显示一些信息,其中可能包含某些单元格中包含一些文本的URL。如何仅使URL可单击,并允许用户在默认浏览器中单击打开它。 问题答案: 您可以在自定义中使用此处显示的方法。选择之后,您可以使用URI。 附录:您可以将其用于编辑器组件并侦听与链接相关的事件。