Bạn sẽ nghĩ rằng họ sẽ công khai đọc hành vi mặc định, phải không? :) Tôi đã chia sẻ sự thất vọng của bạn khi xây dựng một API tùy chỉnh để giao diện với S3 từ giải pháp C #. Đây là đoạn mã hoàn thành việc tải lên một đối tượng S3 và đặt nó thành quyền truy cập đọc công khai theo mặc định:
public void Put(string bucketName, string id, byte[] bytes, string contentType, S3ACLType acl) {
string uri = String.Format("https://{0}/{1}", BASE_SERVICE_URL, bucketName.ToLower());
DreamMessage msg = DreamMessage.Ok(MimeType.BINARY, bytes);
msg.Headers[DreamHeaders.CONTENT_TYPE] = contentType;
msg.Headers[DreamHeaders.EXPECT] = "100-continue";
msg.Headers[AWS_ACL_HEADER] = ToACLString(acl);
try {
Plug s3Client = Plug.New(uri).WithPreHandler(S3AuthenticationHeader);
s3Client.At(id).Put(msg);
} catch (Exception ex) {
throw new ApplicationException(String.Format("S3 upload error: {0}", ex.Message));
}
}
Hàm ToACLString (acl) trả về public-read , BASE_SERVICE_URL là s3.amazonaws.com và hằng số AWS_ACL_HEADER là x-amz-acl . Trình cắm và nội dung DreamMessage có thể trông lạ lẫm đối với bạn vì chúng tôi đang sử dụng khung công tác Dream để hợp lý hóa liên lạc http của chúng tôi. Về cơ bản, chúng tôi đang thực hiện một http PUT với các tiêu đề được chỉ định và chữ ký tiêu đề đặc biệt theo thông số kỹ thuật aws (xem trang này trong tài liệu aws để biết các ví dụ về cách tạo tiêu đề ủy quyền).
Để thay đổi 1000 ACL đối tượng hiện có, bạn có thể viết một tập lệnh nhưng có thể dễ dàng hơn khi sử dụng công cụ GUI để khắc phục sự cố ngay lập tức. Điều tốt nhất tôi đã sử dụng cho đến nay là từ một công ty có tên cloudberry cho S3; có vẻ như họ có 15 ngày dùng thử miễn phí cho ít nhất một trong các sản phẩm của họ. Tôi vừa xác minh rằng nó sẽ cho phép bạn chọn nhiều đối tượng cùng một lúc và đặt ACL của chúng thành công khai thông qua menu ngữ cảnh. Tận hưởng đám mây!