【发布时间】:2012-02-22 11:46:12
【问题描述】:
我正在使用 curl 调用 Java ReST API 以检索 URL。然后,Java 使用我的 S3 凭据为 S3 上传生成预签名 URL,并在 ReST 回复中返回该 URL。 Curl 获取 URL 并将其用于上传到 S3,但 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);
}
}
在 curl 中,从 bash 运行,我执行这个:
echo Will try to upload chunk to ${location}
curl -i -X POST \
-F 'Content-Type=application/octet-stream' \
-F "file=@${fileName}" \
${location} || (echo upload chunk failed. ; exit 1 )
除其他外,我尝试过 PUT,并且尝试过“内容类型”(小写 T)。我意识到我遗漏了一些(或一些)明显的东西,但是在阅读了适当的文档、谷歌搜索并查看了许多类似的问题之后,我不确定那是什么。我看到很多关于所需标头的提示,但我认为辞职的 URL 应该消除这些需求。也许不是?
TIA!
更新:
为了清楚起见,我已经测试了下载,效果很好。
Java 看起来像:
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(BUCKET, key, HttpMethod.GET);
req.setExpiration(expiration);
而 curl 很简单:
curl -i ${location}
【问题讨论】: