Sie würden denken, sie würden das Standardverhalten öffentlich lesen lassen, nicht wahr? :) Ich habe Ihre Frustration beim Erstellen einer benutzerdefinierten API für die Schnittstelle mit S3 aus einer C # -Lösung geteilt. Hier ist das Snippet, mit dem ein S3-Objekt hochgeladen und standardmäßig auf öffentlich lesbaren Zugriff gesetzt wird:
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));
}
}
Die ToACLString (acl) -Funktion gibt public-read zurück , BASE_SERVICE_URL ist s3.amazonaws.com und die AWS_ACL_HEADER-Konstante ist x-amz-acl . Das Plug- und DreamMessage-Material wird für Sie wahrscheinlich seltsam aussehen, da wir das Dream-Framework verwenden, um unsere http-Kommunikation zu optimieren. Im Wesentlichen führen wir einen http-PUT mit den angegebenen Headern und einer speziellen Headersignatur gemäß aws-Spezifikationen durch (siehe diese Seite in den aws-Dokumenten Beispiele zum Erstellen des Autorisierungsheaders finden ).
Um vorhandene 1000 Objekt-ACLs zu ändern, können Sie ein Skript schreiben, aber es ist wahrscheinlich einfacher, ein GUI-Tool zu verwenden, um das unmittelbare Problem zu beheben. Das Beste, was ich bisher verwendet habe, stammt von einer Firma namens Cloudberry für S3. Es sieht so aus, als hätten sie eine kostenlose 15-Tage-Testversion für mindestens eines ihrer Produkte. Ich habe gerade überprüft, dass Sie damit mehrere Objekte gleichzeitig auswählen und ihre ACL über das Kontextmenü auf öffentlich setzen können. Genieße die Wolke!