我使用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