对于小于5mb的文件,我的配置正在上传。对于大于5mb的文件,它们总是失败并且来自AWS的Post响应:
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>..
我正在使用NodeJS,演示s3handler.js中的相关函数没有改变,例如:signRestRequest()函数似乎按照本文档的预期工作:
对于使用此配置的小于5mb的文件,如果连接已关闭然后自动重新打开,则恢复正常工作。我在同一个本地Ubuntu VM中托管页面和NodeJS。我的浏览器端配置:
$('#fineUploader').fineUploaderS3({
request: {
endpoint: "https://s3-us-west-2.amazonaws.com/bucket-name-redacted/",
accessKey: "keyredacted",
},
signature: {
endpoint: "http://192.168.1.203:8000/s3handler"
},
uploadSuccess: {
endpoint: "http://192.168.1.203:8000/s3UploadSuccess"
},
retry: {
enableAuto: true
},
chunking: {
enabled: true //not working
},
resume: {
enabled: true
}
});
这是SHA1 HMac编码之前的响应,然后是base64编码:
POST
application/pdf
x-amz-acl:private
x-amz-date:Fri, 05 Jun 2015 19:26:17 GMT
x-amz-meta-qqfilename:filename.pdf
/bucket-name/13af5c15-ba04-4375-a6f9-25c2691ed827.pdf?uploads
我的临时测试S3 Bucket CORS配置:
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<ExposeHeader>ETag</ExposeHeader>
<AllowedHeader>x-amz-acl</AllowedHeader>
<AllowedHeader>x-amz-meta-qqfilename</AllowedHeader>
<AllowedHeader>x-amz-date</AllowedHeader>
<AllowedHeader>x-amz-server-side-encryption</AllowedHeader>
<AllowedHeader>authorization</AllowedHeader>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
我可以根据需要提供任何其他信息并购买许可证。谢谢!!
这是发送到AWS帖子的标题,用于多部分上传:
答案 0 :(得分:0)
如果AWS报告您的签名不正确,则问题在于您的签名生成代码。如文档所述,分块请求(默认文件大于5 MB)使用S3的分段上传API,签名要求也不同。
以下内容来自Fine Uploader的文档,特别是分块上传:
Chunked Uploads
Fine Uploader S3使用Amazon S3的REST API来启动,上传,完成和中止分段上传。 REST API通过对标准格式的标头进行签名来处理身份验证。这种签名是您实现服务器端所需要的。您的所有服务器需要做的是验证和支持直接到Amazon S3的分块上传,这是一个字符串,表示Fine Uploader发送给S3的请求的标头。此字符串位于签名请求的有效内容中:
{“headers”:/ *要签名的字符串* /}
此属性的precense向您的服务器指示这实际上是签署REST /多部分请求而不是策略文档的请求。
标题字符串的此签名与策略文档签名略有不同。在签名之前,不应该对头字符串进行base64编码。您必须在服务器端执行的操作是使用AWS密钥生成字符串的HMAC SHA1签名,然后对结果进行base64编码。您的服务器应在“application / json”响应的正文中回复以下内容:
{“signature”:/ * signed headers string * /}