我正在使用Java Play框架将多部分音频和pdf文件上传到Amazon。文件已成功上载到Amazon S3上。但即使我在上传文件时将访问频道列表设置为“公共阅读”,我也无法通过URL访问它们。 这是我用于上传文件的代码
public void uploadFile2(String bucketName, String folderName,File file)
throws Exception{
try {
validateCrediantals();
}catch (Exception e){
throw e;
}
List<PartETag> partETags = new ArrayList<PartETag>();
// Step 1: Initialize.
InitiateMultipartUploadRequest initRequest = new
InitiateMultipartUploadRequest(bucketName, folderName).withCannedACL(CannedAccessControlList.PublicRead);
InitiateMultipartUploadResult initResponse =
amazonS3.initiateMultipartUpload(initRequest);
long contentLength = file.length();
long partSize = 5242880; // Set part size to 5 MB.
try {
// Step 2: Upload parts.
long filePosition = 0;
for (int i = 1; filePosition < contentLength; i++) {
// Last part can be less than 5 MB. Adjust part size.
partSize = Math.min(partSize, (contentLength - filePosition));
// Create request to upload a part.
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucketName).withKey(folderName)
.withUploadId(initResponse.getUploadId()).withPartNumber(i)
.withFileOffset(filePosition)
.withFile(file)
.withPartSize(partSize);
// Upload part and add response to our list.
partETags.add(
amazonS3.uploadPart(uploadRequest).getPartETag());
filePosition += partSize;
}
// Step 3: Complete.
CompleteMultipartUploadRequest compRequest = new
CompleteMultipartUploadRequest(
bucketName,
folderName,
initResponse.getUploadId(),
partETags);
amazonS3.completeMultipartUpload(compRequest);
} catch (Exception e) {
amazonS3.abortMultipartUpload(new AbortMultipartUploadRequest(
bucketName, folderName, initResponse.getUploadId()));
}
}
这是我尝试点击文件网址时遇到的错误
> <Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>3A791F42F7EE2DBB</RequestId>
<HostId>
jzdu7uNv4RAkqMcaX2BGIK2Zs77j3kO0xPozxS6vcje0MOZIAVm55ZfC9LhgIg1lIuqXWwonpB4=
</HostId>
</Error>
这是我正在使用的政策
public void setBucketPolicy(String bucketName){
if(isBucketExist(bucketName)){
Statement allowPublicReadStatement = new Statement(Statement.Effect.Allow)
.withPrincipals(Principal.AllUsers)
.withActions(S3Actions.GetObject)
.withResources(new S3ObjectResource(bucketName, "*"));
Policy policy = new Policy()
.withStatements(allowPublicReadStatement
);
amazonS3.setBucketPolicy(bucketName, policy.toJson());
}
}