我有一個使用EmberJS構建的前端客戶端,特別是ember-uploader來處理將文件直接上傳到S3。在卡住的地方,我似乎無法使用我的後端服務器(Java Dropwizard微服務)在請求亞馬遜前正確簽署請求。通過AWS-Java SDK爲瀏覽器簽名S3上傳請求
我知道我可以創建一個GeneratePresignedUrlRequest
,但我使用的前端庫特別需要從服務器返回一個json對象,所以我試圖將該GeneratePresignedUrlRequest
拆分爲一個對象。
目前所有這些似乎都很好,但我錯過了policy
,因爲我無法制定正確的創建方法。
private SignRequestObject createSignRequestObject(List<NameValuePair> valuePairs) {
SignRequestObject request = new SignRequestObject();
request.setKey("test.txt");
request.setBucket("test-bucket");
request.setPolicy("?");
for (NameValuePair pairs : valuePairs) {
if (pairs.getName().equals("X-Amz-Credential")) {
request.setCredentials(pairs.getValue());
}
if (pairs.getName().equals("X-Amz-Signature")) {
request.setSignature(pairs.getValue());
}
if (pairs.getName().equals("X-Amz-Algorithm")) {
request.setAlgorithm(pairs.getValue());
}
if (pairs.getName().equals("X-Amz-Date")) {
request.setDate(pairs.getValue());
}
}
return request;
}
的valuePairs從GeneratePresignedUrlRequest
private String createSignedUrl() {
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest("test-bucket", "test.txt");
generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
return amazonS3.generatePresignedUrl(generatePresignedUrlRequest).toString();
}
未來根據燼,上傳的wiki我想要的策略對象看起來是這樣的:
// Ruby example, but shouldn't matter
{
expiration: @expires,
conditions: [
{ bucket: 'sandbox' },
{ acl: 'public-read' },
{ expires: @expires },
{ success_action_status: '201' },
[ 'starts-with', '$key', '' ],
[ 'starts-with', '$Content-Type', '' ],
[ 'starts-with', '$Cache-Control', '' ],
[ 'content-length-range', 0, 524288000 ]
]
)
我應該嘗試自己構建這個或者aws-sdk是否有這個方法?我總是看到AWS Signature Version 4
左右,但無法找到如何使用它。
當試圖通過瀏覽器上傳時,我從亞馬遜獲得403回。
我強烈建議您使用的JetS3t。 – chrylis
你能否擴展jets3t的哪些部分適用?我能看到的最接近的文檔是S3 POST表單,這是我之後的一種,但我不想通過後端服務呈現表單 –
我強烈建議使用後端創建至少簽名,在這種情況下,您可以使用任何必要的參數向服務器發送AJAX帖子,服務器將簽名發回,然後將組合的表單和簽名提供給客戶端上傳器。 – chrylis