我有一个需要将文件上传到S3的播放应用程序.我们正在使用Scala开发并使用Java AWS SDK.
我在尝试上传文件时遇到问题,在使用预先签名的网址时,我一直收到403 SignatureDoesNotMatch.使用AWS Java SDK通过以下代码生成URL:
def generatePresignedPutRequest(filename: String) = { val expiration = new java.util.Date(); var msec = expiration.getTime() + 1000 * 60 * 60; // Add 1 hour. expiration.setTime(msec); s3 match { case Some(s3) => s3.generatePresignedUrl(bucketname, filename, expiration, HttpMethod.PUT).toString case None => { Logger.warn("S3 is not availiable. Cannot generate PUT request.") "URL not availiable" } } }
对于前端代码,我们遵循ioncannon文章.
上传文件的js函数(与文章中使用的相同)
function uploadToS3(file, url) { var xhr = createCORSRequest('PUT', url); if (!xhr) { setProgress(0, 'CORS not supported'); } else { xhr.onload = function() { if(xhr.status == 200) { setProgress(100, 'Upload completed.'); } else { setProgress(0, 'Upload error: ' + xhr.status); } }; xhr.onerror = function() { setProgress(0, 'XHR error.'); }; xhr.upload.onprogress = function(e) { if (e.lengthComputable) { var percentLoaded = Math.round((e.loaded / e.total) * 100); setProgress(percentLoaded, percentLoaded == 100 ? 'Finalizing.' : 'Uploading.'); } }; xhr.setRequestHeader('Content-Type', 'image/png'); xhr.setRequestHeader('x-amz-acl', 'authenticated-read'); xhr.send(file); } }
服务器的响应是
SignatureDoesNotMatch
The request signature we calculated does not match the signature you provided. Check your key and signing method. 50 55 bla bla bla... F7A8F1659DE5909C q+r+2T5K6mWHLKTZw0R9/jm22LyIfZFBTY8GEDznfmJwRxvaVJwPiu/hzUfuJWbW PUT image/png 1387565829 x-amz-acl:authenticated-read /mybucketname/icons/f5430c16-32da-4315-837f-39a6cf9f47a1 myaccesskey
我已经配置了CORS,双重检查了aws凭据并尝试更改请求标头.我总是得到相同的结果.亚马逊为什么告诉我签名不匹配?