Anda akan berpikir mereka akan membuat publik membaca perilaku default, bukan? :) Saya membagikan rasa frustrasi Anda saat membangun API khusus untuk berinteraksi dengan S3 dari solusi C #. Berikut ini cuplikan yang menyelesaikan pengunggahan objek S3 dan menyetelnya ke akses baca publik secara default:
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));
}
}
Fungsi ToACLString (acl) mengembalikan bacaan publik , BASE_SERVICE_URL adalah s3.amazonaws.com dan konstanta AWS_ACL_HEADER adalah x-amz-acl . Plug dan item DreamMessage kemungkinan akan terlihat aneh bagi Anda karena kami menggunakan kerangka Dream untuk merampingkan komunikasi http kami. Pada dasarnya kami melakukan PUT http dengan header yang ditentukan dan tanda tangan header khusus sesuai spesifikasi aws (lihat halaman ini di dokumen aws untuk contoh bagaimana membuat header otorisasi).
Untuk mengubah 1000 objek ACL yang sudah ada, Anda dapat menulis skrip tetapi mungkin lebih mudah menggunakan alat GUI untuk segera memperbaiki masalah. Yang terbaik yang pernah saya gunakan sejauh ini adalah dari perusahaan bernama cloudberry untuk S3; tampaknya mereka memiliki uji coba gratis selama 15 hari untuk setidaknya satu produk mereka. Saya baru saja memverifikasi bahwa itu akan memungkinkan Anda untuk memilih beberapa objek sekaligus dan mengatur ACL mereka ke publik melalui menu konteks. Selamat menikmati cloud!