Estoy usando una biblioteca PHP para cargar un archivo en mi bucket. He configurado la ACL en lectura-escritura pública y funciona bien, pero el archivo sigue siendo privado.
Descubrí que si cambio el Beneficiario a Todos hace público el archivo. Lo que quiero saber es cómo hago que el concesionario predeterminado en todos los objetos en mi depósito se establezca en "Todos" . ¿O hay otra solución para hacer públicos los archivos de forma predeterminada?
El código que estoy usando está abajo:
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;
}
fuente
Si desea que todos los objetos sean públicos de forma predeterminada, la forma más sencilla es hacerlo a través de una Política de depósito en lugar de las Listas de control de acceso (ACL) definidas en cada objeto individual.
Puede usar el Generador de políticas de AWS para generar una política de depósito para su depósito.
Por ejemplo, la siguiente política permitirá que cualquier persona lea cada objeto en su depósito S3 (simplemente reemplácelo
<bucket-name>
con el nombre de su depósito):La Política de depósito contiene una lista de
Statements
y cada declaración tiene unEffect
(oAllow
oDeny
) para una lista deActions
que son realizados porPrincipal
(el usuario) en el especificadoResource
(identificado por unAmazon Resource Name
oARN
).El
Id
es sólo un ID de política opcional y elSid
es un único ID opcional comunicado.Para las Políticas de cubo de S3, los ARN de recursos toman la forma:
El ejemplo anterior permite que (
Effect: Allow
) cualquiera (Principal: *
) acceda (Action: s3:GetObject
) a cualquier objeto en el depósito (Resource: arn:aws:s3:::<bucket-name>/*
).fuente
Principal: *
me ayudo mucho. ¡Gracias!Mi problema era ligeramente diferente, pero como esta pregunta está en la parte superior de la búsqueda de Google, dejaré mi solución, tal vez ayude a alguien.
Ya había tenido acceso completo al cubo S3 antes, pero un día comenzó a volver
Access Denied
a todos mis archivos. La solución fue sencilla y simple.Services
-S3
Permissions
pestaña, luego vaya a laBucket Policy
pestañaSave
botón.Debería reasignar el permiso en todos sus archivos.
De todos modos, aquí está completo lo
bucket policy
que permite hacer públicos todos los objetosfuente