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

使用签名URL上传到AmazonS3可以使用curl,但不能使用javascript

衡高寒
2023-03-14

我试图上传一个文件到亚马逊S3使用PUT请求。我生成我的签名网址使用boto。如果我做了

curl --upload-file test.jpg $SIGNED_URL

然后上传工作正常(所以签名网址没有问题)。我还将裁判设置为卷曲的各种东西,它仍然有效,所以我也不认为有CORS问题。我试图上传一个文件blob使用javascript如下:

var xmlhttp = new XMLHttpRequest();    
xmlhttp.open("PUT", $SIGNED_URL);
xmlhttp.setRequestHeader('Content-Type', blob.type);
xmlhttp.send(blob);

这总是返回403禁止的错误。我发现在网上很难找到任何关于从javascript将数据放入S3的信息。我现在意识到发布表单数据更为常见,但有没有办法修改我正在做的工作以使其也能正常工作?

编辑:我现在找到了错误主体:

> <Error><Code>SignatureDoesNotMatch</Code> <Message>The request
> signature we calculated does not match the signature you provided.
> Check your key and signing method.</Message>

因此,似乎签名是个问题。同样,当我将url与curl一起使用时(即使在javascript中失败之后),同样的url也可以工作。

共有2个答案

昌山
2023-03-14

对我来说,问题是我在生成预签名URL时没有设置内容类型,所以在生成预签名URL时添加了这一点

java.util.Date expiration = new java.util.Date();
        long msec = expiration.getTime();
        msec +=  60 * 60 * 1000; // 1 hour.
        expiration.setTime(msec);

        GeneratePresignedUrlRequest generatePresignedUrlRequest =
                new GeneratePresignedUrlRequest("bucket_name", "someRandomKey");
        generatePresignedUrlRequest.setMethod(HttpMethod.PUT); // Default.
        generatePresignedUrlRequest.setExpiration(expiration);
        generatePresignedUrlRequest.setContentType("application/octet-stream");

        URL s = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
        System.out.println("Secure PUT URL is "+s);

这是卷曲

curl -v -X PUT \
  'generated_secure_url' \ 
  -H 'Content-Type:application/octet-stream' \
  --data-binary '@swiggy-hackathon.jpg'
林丁雷
2023-03-14

问题是curl没有发送的“内容标题”。Chrome发送这个标题,不管你是否显式添加它。要获得一个可使用此标头的签名url,您需要将标头={'Content-Type': type}传递到boto中的generate_url。

 类似资料:
  • 我上传一个文件到AmazonS3有问题。我开发了一个Grails RESTful服务,它使用AWS Java SDK生成预签名URL。当客户端上传一个文件时,它首先检索一个预签名的URL,然后使用这个将文件直接上传到我的S3 bucket。所以我有一个Grails服务,它创建了一个预签名的URL,如下所示...

  • 这里是我的node.js预签名URL的生成 那么我在URL生成或卷曲方面的问题在哪里呢?谢谢

  • 我有一个亚马逊S3的postdata预签名网址。我想用它在一个空手道功能文件上传一个文件(说:pdf) 下面是一个示例Curl请求,我需要使用空手道POST请求执行它 我从服务器得到一个响应(具有预签名),并在功能文件中使用下面的代码 我试过了 我看到空手道日志的请求格式是:18:29:08.560[ForkJoinPool-1-worker-3]DEBUG-com。凭直觉。空手道-请求: 我看到

  • 我知道使用以下方法限制对象的上载大小:http://doc.s3.amazonaws.com/proposals/post.html#limiting_uploaded_content 但是我想知道如何在服务器端以IAM用户的身份使用S3 SDK生成预签名url的同时完成。

  • 问题内容: 我正在尝试使用预签名的URL将文件上传到Amazon的S3。我从生成URL的服务器获取URL,并将其作为JSON对象的一部分发送给我。我将URL作为字符串获取,如下所示: https://com-example-mysite.s3-us- east-1.amazonaws.com/userFolder/ImageName?X-Amz-Security- Token=xxfooxx%2F

  • 我想检查一堆URL是否正常工作。因此,我编写了一些代码(如下所示)来实现这一点。它适用于像谷歌这样的网站。通用域名格式。当我把它应用到我的场景中时,它失败了。 我正在登录虚拟机。从这个虚拟机,我可以在浏览器中打开所需的URL。当我尝试检查是否可以用代码连接到URL时,它失败了。我的代码从文件中获取的URL是正确的,可以在浏览器上运行。因此,排除了URL中的错误。 我的服务器URL如下所示- 如何调