Tôi đang cố tải lên tệp bằng SDK Java của Amazon, thông qua tải lên nhiều phần. Ý tưởng là chuyển một id tải lên thành một applet, trong đó đặt các phần của tệp vào một nhóm chỉ đọc. Đi theo cách này, tôi tránh lưu trữ thông tin đăng nhập AWS trong applet.Đặt tệp vào Amazon S3 bằng cách sử dụng tính năng tải lên nhiều phần
Trong các thử nghiệm của mình, tôi tạo id tải lên có boto (python) và lưu trữ tệp vào thùng. Điều đó hoạt động tốt.
Applet của tôi bị "Truy cập 403 bị từ chối" từ S3 và tôi không biết tại sao.
Dưới đây là mã của tôi (mà là một phần lấy từ http://docs.amazonwebservices.com/AmazonS3/latest/dev/llJavaUploadFile.html):
AmazonS3 s3Client = new AmazonS3Client();
List<PartETag> partETags = new ArrayList<PartETag>();
long contentLength = file.length();
long partSize = Config.getInstance().getInt("part_size");
String bucketName = Config.getInstance().getString("bucket");
String keyName = "mykey";
String uploadId = getParameter("upload_id");
try {
long filePosition = 0;
for (int i = 1; filePosition < contentLength; i++) {
partSize = Math.min(partSize, (contentLength - filePosition));
// Create request to upload a part.
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucket).withKey(keyName)
.withUploadId(uploadId).withPartNumber(i)
.withFileOffset(filePosition)
.withFile(file)
.withPartSize(partSize);
// Upload part and add response to our list.
partETags.add(s3Client.uploadPart(uploadRequest).getPartETag());
filePosition += partSize;
}
System.out.println("Completing upload");
CompleteMultipartUploadRequest compRequest = new
CompleteMultipartUploadRequest(bucket,
keyName,
uploadId,
partETags);
s3Client.completeMultipartUpload(compRequest);
} catch (Exception e) {
s3Client.abortMultipartUpload(new AbortMultipartUploadRequest(
bucketName, keyName, uploadId));
}
Trong nhật ký Applet debug, tôi tìm thấy điều này, thì:
INFO: Sending Request: PUT https://mybucket.s3.amazonaws.com /mykey Parameters: (uploadId: V4hwobOLQ1rYof54zRW0pfk2EfhN7B0fpMJTOpHOcmaUl8k_ejSo_znPI540.lpO.ZO.bGjh.3cx8a12ZMODfA--, partNumber: 1,) Headers: (Content-Length: 4288546, Content-Type: application/x-www-form-urlencoded; charset=utf-8,)
24.01.2012 16:48:42 com.amazonaws.http.AmazonHttpClient handleErrorResponse
INFO: Received error response: Status Code: 403, AWS Service: null, AWS Request ID: DECF32CCFEE9EBF0, AWS Error Code: AccessDenied, AWS Error Message: Access Denied, S3 Extended Request ID: xtL1ixsGM2/vsxJ+cZRHpkPZ23SMfP8hZZjQCQnp8oWGwdS2/aGfYgomihyqaDCQ
Bạn có thấy bất kỳ thất bại rõ ràng trong mã?
Cảm ơn, Stefan
Cảm ơn rất nhiều vì những suy nghĩ của bạn. Ngay cả khi có thể thực hiện các yêu cầu ẩn danh đối với S3 nếu thùng công khai có sẵn, giả định của bạn có vẻ đúng, việc tải lên nhiều phần không chỉ được thực hiện cho trường hợp của tôi. Và các URL được ký trước không có sẵn để tải lên nhiều phần tử quá xấu. Tuy nhiên, tôi quyết định sử dụng cơ chế AWAM IAM để thiết lập chính sách viết-viết cho nhóm và lưu trữ thông tin xác thực cho người dùng mới được cấu hình tương ứng trong applet. Từ quan điểm bảo mật, nó sẽ ổn thôi. – schneck
@schneck: Tạo thuận lợi cho chính sách chỉ viết IAM là một lựa chọn tuyệt vời, tôi đã tập trung quá nhiều vào * cách * bạn đang cố gắng đạt được mục tiêu của mình hơn là trường hợp sử dụng thực tế - bạn có thể thực hiện điều đó hơn nữa bằng cách Yêu cầu Sử dụng thông tin đăng nhập tạm thời của người dùng IAM] (http://docs.amazonwebservices.com/AmazonS3/latest/dev/AuthUsingTempSessionTokenJava.html) để tránh hoàn toàn việc lưu trữ thông tin đăng nhập vĩnh viễn trong applet của bạn. –
Không phải là mối nguy hiểm với một thùng chỉ công khai, chỉ là một người nào đó có thể spam thùng của bạn bằng cách sử dụng không có gì hơn curl? Hay tôi đang thiếu một cái gì đó? – sethcall