簡體   English   中英

如何通過 REST API 將文件上傳到 s3

[英]How to upload files to s3 via REST API

我正在嘗試使用 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>

根據文檔,StringToSign 僅在獲取種子簽名時才需要 CanonicalRequest,而 StringToSign 在執行塊上傳時需要先前的簽名。

我的理解是種子簽名生成Authorization,用於獲取uploadId。 在區塊上傳過程中,生成簽名如下生成Authorization。 不知是不是我理解錯了?

塊簽名

請求信息如下,不知道哪里出錯了。

請求信息

還有,在構建簽名的時候,需要設置Content-Length和x-amz-decoded-content-length,但是我沒有設置(因為我不知道如何計算chunk-metadata的長度),我不確定是否必須設置它們。

我也不太明白文檔中描述的塊結構。 我如何發送這個結構數據?

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

希望能指點迷津,萬分感謝!

將content-type設置為application / octet-stream,將AWS auth密鑰放在Authorization標頭中。 我在下面提供參考鏈接,該鏈接顯示了將文件上傳到s3存儲桶的java示例

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

安裝文檔以生成塊簽名對我來說很困難。 我使用種子簽名為每個塊上載提供授權,這意外地起作用。 關於簽名,也許我理解錯了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM