【问题标题】:How to upload files to s3 via REST API如何通过 REST API 将文件上传到 s3
【发布时间】:2019-07-25 17:35:57
【问题描述】:

我正在尝试使用 REST API 将大文件片段上传到 S3。根据文档可以得到Initiate Multipart Upload需要的uploadId,但是在执行第二步Upload Part的时候,得到错误信息:SignatureDoesNotMatch,具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AKIAJSHB7UUBEBAA7R3Q</AWSAccessKeyId><StringToSign>AWS4-HMAC-SHA256
20190304T090043Z
20190304/ap-northeast-1/s3/aws4_request
af7e7ce5502f17450f855d48504417d144fae382e6cb02424b00f7a26447bfb9</StringToSign><SignatureProvided>738dd1ddf3d820890a460670e383e9a77f1a085f0db299ba0fc333ba98fc4613</SignatureProvided><StringToSignBytes>41 57 53 34 2d 4...</StringToSignBytes><CanonicalRequest>PUT
/201903/04/mYvQx4dHgY14A.f4v
partNumber=1&amp;uploadId=jpaQIecVCKdk9owl9_GARzhWzj__er1Xsm8gsuEFYW9YV6KTsPtsnf_b2x.TxV3Q.9oEWJhmd0NcG87YWGMM3u9ejpNhs5_xRIJ3khNCB4Wj1XGEzsNxGpJ.l21JwN0aAzkZBm_ZYwlGgkdjf8aJU.Q--
content-encoding:aws-chunked
content-type:application/octet-stream
host:bucketName.s3.ap-northeast-1.amazonaws.com
x-amz-content-sha256:3a71ba7ecd2ca6c45a1c55e501649fe0528cca013a41ec039a5d72d007196e49
x-amz-date:20190304T090043Z
x-amz-storage-class:REDUCED_REDUNDANCY

content-encoding;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class
3a71ba7ecd2ca6c45a1c55e501649fe0528cca013a41ec039a5d72d007196e49</CanonicalRequest><CanonicalRequestBytes>50 55 54 0a ...</CanonicalRequestBytes><RequestId>D05D18BA7169E142</RequestId><HostId>MX4bdbYIJNzuZXwqp+GrO0ToPbRdX0dYL/9aSrjA/2RpW0YItHAC52Rf1Tur9rcrlRNNYbVTI5E=</HostId></Error>

根据documentation,StringToSign 仅在获取种子签名时需要 CanonicalRequest,而 StringToSign 在进行块上传时需要previouse-signature。

我的理解是种子签名生成Authorization,用来获取uploadId。在区块上传过程中,签名生成如下,生成Authorization。不知道是不是我理解有误?

请求信息如下,不知道哪里出错了。

另外,在构建签名时,需要设置Content-Length和x-amz-decoded-content-length,但是我没有设置(因为我不知道如何计算chunk的长度-元数据),我不确定是否必须设置它们。

我也不太了解文档中描述的块结构。如何发送此结构数据?

string(IntHexBase(chunk-size)) + ";chunk-signature=" + signature + \r\n + chunk-data + \r\n

希望能指点一下,非常感谢!

【问题讨论】:

    标签: javascript api amazon-s3 upload multipart


    【解决方案1】:

    将内容类型设置为 application/octet-stream 将 AWS auth key 放在 Authorization 标头中。 我在下面提供了参考链接,该链接显示了将文件上传到 s3 存储桶的 java 示例

    http://www.tothenew.com/blog/file-upload-on-amazon-s3-server-via-rest-api-call/

    【讨论】:

    • 感谢您的回复,但您的代码似乎不适用于我的项目。我需要配合前端的webuploader完成上传(服务器通过php获取签名)。根据上传部分的返回信息中的CanonicalRequest,好像需要在每个shard上传请求中使用初始化生成的Authorization?但是不应该是用每个片段自己的签名生成授权吗?这让我很不爽。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多