我使用curl调用Java ReST API来检索URL。然后,Java使用我的S3凭证为S3上传生成一个预先签名的URL,并在ReST回复中返回。 Curl获取URL并将其用于上传到S3,但S3返回403“我们计算的请求签名与您提供的签名不匹配,请检查您的密钥和签名方法。”使用预先签名的URL通过curl上传到s3(获得403)
这里是我使用生成签名的预URL代码:
public class S3Util {
static final AmazonS3 s3 = new AmazonS3Client(new AWSCredentials() {
@Override
public String getAWSAccessKeyId() {
return "XXXXXXX";
}
@Override
public String getAWSSecretKey() {
return "XXXXXXXXXXXXXX";
}
});
static final String BUCKET = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";
static public URL getMediaChunkURL(MediaChunk mc, HttpMethod method) {
String key = ...
//way in the future (for testing)...
Date expiration = new Date(System.currentTimeMillis() + CalendarUtil.ONE_MINUTE_IN_MILLISECONDS*60*1000);
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(BUCKET, key, method);
req.setExpiration(expiration);
req.addRequestParameter("Content-Type", "application/octet-stream");
//this gets passed to the end user:
return s3.generatePresignedUrl(req);
}
}
和卷曲,从庆典跑,我执行此:
echo Will try to upload chunk to ${location}
curl -i -X POST \
-F 'Content-Type=application/octet-stream' \
-F "[email protected]${fileName}" \
${location} || (echo upload chunk failed. ; exit 1)
除其他事项外,我试过PUT,而且我尝试过“Content-type”(小写字母T)。我意识到我错过了某些东西(或某些东西)显而易见,但是在阅读了相应的文档,使用Google搜索并查看了很多类似的问题后,我不确定这是什么。我看到很多关于需要的标题的提示,但我认为这个被拒绝的URL应该可以消除这些需求。也许不会?
TIA!
更新:
只是要清楚,我已经测试的下载,并且运行良好。
Java的样子:
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(BUCKET, key, HttpMethod.GET);
req.setExpiration(expiration);
和卷曲很简单:
curl -i ${location}
感谢你。我坚持使用我的解决方案,因为我首先得到它,但我将其标记为正确,因为它解决了原始查询,并且,我认为它更好。 – 2012-01-31 20:30:14
对我而言,预先签名的网址包含需要我用引号括住整个网址的字符。一旦我做到了,你的回答就完美了。 – 2014-03-17 21:52:07
对我来说,使用POST预先签名的URL不起作用。只切换方法(在GeneratePresignedUrlRequest和curl中)解决了这个问题。 – 2017-01-28 16:01:23