Można by pomyśleć, że upublicznią domyślne zachowanie, prawda? :) Podzieliłem się twoją frustracją podczas budowania niestandardowego interfejsu API do interfejsu z S3 z rozwiązania C #. Oto fragment kodu, który dokonuje przesłania obiektu S3 i domyślnie ustawia go na publiczny dostęp do odczytu:
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));
}
}
Funkcja ToACLString (acl) zwraca public-read , BASE_SERVICE_URL to s3.amazonaws.com, a stała AWS_ACL_HEADER to x-amz-acl . Wtyczka i DreamMessage prawdopodobnie będą wyglądać dziwnie, ponieważ używamy frameworka Dream do usprawnienia naszej komunikacji http. Zasadniczo robimy http PUT z określonymi nagłówkami i specjalną sygnaturą nagłówka zgodnie ze specyfikacjami aws (zobacz tę stronę w dokumentacji aws, aby zapoznać się z przykładami konstruowania nagłówka autoryzacji).
Aby zmienić istniejące listy ACL zawierające 1000 obiektów, można napisać skrypt, ale prawdopodobnie łatwiej jest użyć narzędzia GUI, aby naprawić natychmiastowy problem. Najlepsze, z których do tej pory korzystałem, pochodzi z firmy o nazwie malina moroszka dla S3; wygląda na to, że co najmniej jeden ze swoich produktów ma bezpłatny 15-dniowy okres próbny. Właśnie sprawdziłem, że pozwoli ci to wybrać wiele obiektów jednocześnie i ustawić ich ACL jako publiczną za pomocą menu kontekstowego. Ciesz się chmurą!