我有一个使用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