【问题标题】:Error uploading file to S3 with presigned url using JQuery使用 JQuery 将文件上传到带有预签名 URL 的 S3 时出错
【发布时间】:2014-10-27 05:46:46
【问题描述】:

我们正在尝试使用 jQuery ajax 和预签名的 url 将文件上传到 S3。我们在服务器上生成预签名的 url。目前我们正在尝试使用FormData 上传文件。

          var uploadData = new FormData(),
            files = $(this.input).prop('files'),
            file = files[0];

          uploadData.append('file', file);

          $.ajax({
            url: '{presigned url string}',
            type: 'PUT',
            data: uploadData,
            cache: false,
            processData: false,
            contentType: false,
            success: function(response) {
              console.log('S3 upload success!');
            },
            error: function(response) {
              console.log('Error with S3 upload: ' + response.statusText);
            }
          });

这会从 AWS 返回 SignatureDoesNotMatch 错误:

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we 
calculated does not match the signature you provided. Check your key and 
signing method.</Message><StringToSignBytes>50 55 54 0a 0a 6d 75 6c 74 69 70 61 72 74 2f 66 6f 72 6d 2d 64 61 74 61 3b 20 62 6f 75 6e 64 61 72 79 3d 2d 2d 2d 2d 57 65 62 4b 69 74 46 6f 72 6d 42 6f 75 6e 64 61 72 79 67 57 6f 4a 73 42 56 79 41 4c 57 71 51 6b 73 69 0a 31 34 30 39 37 37 37 32 39 33 0a 2f 64 69 2d 6b 79 72 73 74 65 6e 2d 64 65 61 6c 73 2f 76 4e 79 4b 4e 55 4c 37 51 68 4f 30 45 4b 38 52 58 44 70 32 59 77 25 32 46 63 35 37 65 64 37 62 39 2d 64 63 61 62 2d 34 63 30 62 2d 62 36 63 30 2d 36 31 66 30 36 62 32 30 37 34 66 31 2d 74 65 73 74 2e 74 78 74</StringToSignBytes>
<RequestId>ED7C581570F547DB</RequestId><HostId>ZT6LsFYCbo1L0gYNcUwtdCWF6SNnyuUyKiL60ntJEZugx3cnDN/yH5KBjgEiBv5c</HostId><SignatureProvided>N2d7oNMVHvI6yxAXujNy8O5cF24=</SignatureProvided>
<StringToSign>PUT

multipart/form-data; boundary=----WebKitFormBoundarygWoJsBVyALWqQksi
1409777293
/test-bucket/vNyKNUL7QhO0EK8RXDp2Yw%2Fc57ed7b9-dcab-4c0b-b6c0-61f06b2074f1-test.txt</StringToSign><AWSAccessKeyId>FAKEACCESSKEY</AWSAccessKeyId></Error>  

我知道预签名的 url 有效,因为我可以通过 CURL 正确上传文件:

curl -v --upload-file {filename} {presigned url}

【问题讨论】:

    标签: javascript jquery file-upload amazon-s3 form-data


    【解决方案1】:

    我们自己发现了问题。这是我们用来生成预签名 url 的代码:

    val dt: DateTime = new DateTime()
    val expiration = DateTime.now.plusMillis(timeout.toInt)
    val presignedUrlRequest: GeneratePresignedUrlRequest =
      new GeneratePresignedUrlRequest(awsBucket, key, HttpMethod.PUT)
    presignedUrlRequest.setExpiration(expiration.toDate())
    // WE ADDED THIS LINE
    presignedUrlRequest.setContentType("multipart/form-data")
    
    s3client.generatePresignedUrl(presignedUrlRequest).toString()
    

    我们必须在 presignedUrlRequest 中设置内容类型,并将
    headers: {'Content-Type': 'multipart/form-data'} 添加到我们的 ajax 调用中。

    我们最初生成 url 的方式是使用 CURL,因为我们没有在 presignedUrlRequest 中设置内容类型,而 curl 也没有设置内容类型。

    【讨论】:

    • 我遇到了同样的问题,但设置内容类型没有帮助。希望得到一些帮助!
    • 这个解决方案对我来说效果很好,但是上传到 S3 的文件附加了 FormData 值。你知道如何预防吗?
    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2015-10-13
    • 2020-10-23
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多