Używam biblioteki PHP, aby przesłać plik do mojego zasobnika. Ustawiłem listę ACL na publiczny odczyt i zapis i działa dobrze, ale plik jest nadal prywatny.
Zauważyłem, że jeśli zmienię beneficjenta na Wszyscy , plik zostanie opublikowany. Chcę wiedzieć, jak ustawić domyślną odbiorcę dla wszystkich obiektów w moim zasobniku na „Wszyscy” . A może istnieje inne rozwiązanie umożliwiające domyślne upublicznienie plików ?
Kod, którego używam, znajduje się poniżej:
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;
}
źródło
Jeśli chcesz, aby wszystkie obiekty były domyślnie publiczne, najprostszym sposobem jest zrobienie tego za pomocą zasad zasobnika zamiast list kontroli dostępu (ACL) zdefiniowanych dla każdego pojedynczego obiektu.
Możesz użyć Generatora zasad AWS, aby wygenerować politykę zasobnika dla swojego zasobnika.
Na przykład następujące zasady pozwolą każdemu odczytać każdy obiekt w Twoim zasobniku S3 (po prostu zastąp
<bucket-name>
nazwą swojego zasobnika):Zasada zasobnika zawiera listę,
Statements
a każda instrukcja maEffect
(alboAllow
alboDeny
) listę czynnościActions
wykonywanych przezPrincipal
(użytkownika) na określonymResource
(oznaczonym symbolemAmazon Resource Name
lubARN
).Jest
Id
to tylko opcjonalny identyfikator zasad, aSid
opcjonalny unikalny identyfikator instrukcji.W przypadku zasad segmentu S3 zasoby ARN mają postać:
Powyższy przykład umożliwia (
Effect: Allow
) każdemu (Principal: *
) dostęp (Action: s3:GetObject
) do dowolnego obiektu w zasobniku (Resource: arn:aws:s3:::<bucket-name>/*
).źródło
Principal: *
bardzo mi pomogło. Dzięki!Mój problem był nieco inny, ale skoro to pytanie jest na górze wyszukiwarki Google, zostawię swoje rozwiązanie, może to komuś pomoże.
Miałem już wcześniej pełny dostęp do zasobnika S3, ale pewnego dnia po prostu zaczął wracać
Access Denied
do wszystkich moich plików. Rozwiązanie było bardzo proste.Services
-S3
Permissions
karty, a następnie przejdź doBucket Policy
kartySave
przycisk.Powinien ponownie przypisać uprawnienia do wszystkich plików.
Zresztą tutaj jest pełna,
bucket policy
która umożliwia upublicznienie wszystkich obiektówźródło