Estou usando uma biblioteca PHP para fazer upload de um arquivo para o meu bucket. Eu configurei a ACL para public-read-write e ela funciona bem, mas o arquivo ainda é privado.
Descobri que, se eu alterar o Beneficiário para Todos , o arquivo será público. O que eu quero saber é como faço para que o Beneficiário padrão em todos os objetos no meu bucket seja definido como "Todos" . Ou existe outra solução para tornar os arquivos públicos por padrão?
O código que estou usando está abaixo:
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;
}
fonte
Se você deseja tornar todos os objetos públicos por padrão, a maneira mais simples é fazê-lo através de uma Política de Balde em vez das Listas de Controle de Acesso (ACLs) definidas em cada objeto individual.
Você pode usar o AWS Policy Generator para gerar uma política de bucket para seu bucket.
Por exemplo, a política a seguir permitirá que qualquer pessoa leia todos os objetos no seu bucket S3 (substitua
<bucket-name>
pelo nome do seu bucket):A Política de Bucket contém uma lista de
Statements
e cada declaração possui umEffect
(Allow
ouDeny
) para uma lista deActions
que são executados peloPrincipal
(usuário) no especificadoResource
(identificado por umAmazon Resource Name
ouARN
).A
Id
é apenas um ID de política opcional eoSid
é um opcional Unique ID comunicado.Para diretivas de balde S3, os ARNs de recurso assumem a forma:
O exemplo acima permite que (
Effect: Allow
) qualquer pessoa (Principal: *
) acesse (Action: s3:GetObject
) qualquer objeto no bucket (Resource: arn:aws:s3:::<bucket-name>/*
).fonte
Principal: *
me ajudou muito. Obrigado!Meu problema era um pouco diferente, mas como essa pergunta está no topo da pesquisa do Google, deixarei minha solução, talvez ajude alguém.
Eu já tinha acesso total ao bucket do S3 antes, mas um dia ele começou a retornar
Access Denied
a todos os meus arquivos. A solução foi direta e simples.Services
-S3
Permissions
guia e vá para aBucket Policy
guiaSave
botãoEle deve reatribuir permissão em todos os seus arquivos.
De qualquer forma, aqui está cheio
bucket policy
que permite tornar todos os objetos públicosfonte