Ich verwende eine PHP-Bibliothek, um eine Datei in meinen Bucket hochzuladen. Ich habe die ACL auf public-read-write gesetzt und sie funktioniert einwandfrei, aber die Datei ist immer noch privat.
Ich habe festgestellt, dass die Datei veröffentlicht wird , wenn ich den Berechtigten in "Jeder" ändere . Ich möchte wissen, wie ich den Standardberechtigten für alle Objekte in meinem Bucket auf "Jeder" setze . Oder gibt es eine andere Lösung, um Dateien standardmäßig öffentlich zu machen ?
Der von mir verwendete Code ist unten:
public static function putObject($input, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array()) {
if ($input === false) return false;
$rest = new S3Request('PUT', $bucket, $uri);
if (is_string($input)) $input = array(
'data' => $input, 'size' => strlen($input),
'md5sum' => base64_encode(md5($input, true))
);
// Data
if (isset($input['fp']))
$rest->fp =& $input['fp'];
elseif (isset($input['file']))
$rest->fp = @fopen($input['file'], 'rb');
elseif (isset($input['data']))
$rest->data = $input['data'];
// Content-Length (required)
if (isset($input['size']) && $input['size'] >= 0)
$rest->size = $input['size'];
else {
if (isset($input['file']))
$rest->size = filesize($input['file']);
elseif (isset($input['data']))
$rest->size = strlen($input['data']);
}
// Custom request headers (Content-Type, Content-Disposition, Content-Encoding)
if (is_array($requestHeaders))
foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v);
elseif (is_string($requestHeaders)) // Support for legacy contentType parameter
$input['type'] = $requestHeaders;
// Content-Type
if (!isset($input['type'])) {
if (isset($requestHeaders['Content-Type']))
$input['type'] =& $requestHeaders['Content-Type'];
elseif (isset($input['file']))
$input['type'] = self::__getMimeType($input['file']);
else
$input['type'] = 'application/octet-stream';
}
// We need to post with Content-Length and Content-Type, MD5 is optional
if ($rest->size >= 0 && ($rest->fp !== false || $rest->data !== false)) {
$rest->setHeader('Content-Type', $input['type']);
if (isset($input['md5sum'])) $rest->setHeader('Content-MD5', $input['md5sum']);
$rest->setAmzHeader('x-amz-acl', $acl);
foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);
$rest->getResponse();
} else
$rest->response->error = array('code' => 0, 'message' => 'Missing input parameters');
if ($rest->response->error === false && $rest->response->code !== 200)
$rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
if ($rest->response->error !== false) {
trigger_error(sprintf("S3::putObject(): [%s] %s", $rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
return false;
}
return true;
}
quelle
Wenn Sie standardmäßig alle Objekte öffentlich machen möchten, können Sie dies am einfachsten über eine Bucket-Richtlinie anstelle von Zugriffssteuerungslisten (Access Control Lists, ACLs) tun, die für jedes einzelne Objekt definiert sind.
Mit dem AWS Policy Generator können Sie eine Bucket-Richtlinie für Ihren Bucket generieren.
Mit der folgenden Richtlinie kann beispielsweise jeder jedes Objekt in Ihrem S3-Bucket lesen (ersetzen Sie es einfach durch
<bucket-name>
den Namen Ihres Buckets):Die Bucket-Richtlinie enthält eine Liste von
Statements
und jede Anweisung hat einEffect
(entwederAllow
oderDeny
) für eine Liste von denenActions
, die vonPrincipal
(dem Benutzer) für das angegebeneResource
(durch einAmazon Resource Name
oder gekennzeichneteARN
) ausgeführt werden.Dies
Id
ist nur eine optionale Richtlinien-ID undSid
eine optionale eindeutige Anweisungs-ID.Für S3-Bucket-Richtlinien haben die Ressourcen-ARNs die folgende Form:
Das obige Beispiel ermöglicht (
Effect: Allow
) jedem (Principal: *
) den Zugriff auf (Action: s3:GetObject
) jedes Objekt im Bucket ()Resource: arn:aws:s3:::<bucket-name>/*
) ).quelle
Principal: *
Hat mir viel geholfen. Vielen Dank!Mein Problem war etwas anders, aber da diese Frage ganz oben in der Google-Suche steht, lasse ich meine Lösung, vielleicht hilft sie jemandem.
Ich hatte bereits zuvor vollen Zugriff auf den S3-Bucket, aber eines Tages kehrte er gerade
Access Denied
zu allen meinen Dateien zurück. Die Lösung war einfach und unkompliziert.Services
-S3
Permissions
Registerkarte und dann zurBucket Policy
RegisterkarteSave
Schaltfläche.Es sollte die Berechtigung für alle Ihre Dateien neu zuweisen.
Wie auch immer, hier ist voll
bucket policy
, was erlaubt, alle Objekte öffentlich zu machenquelle