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

En acción seleccione "GetObject" Seleccione "Agregar declaración" Luego seleccione "Generar política"
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
Statementsy cada declaración tiene unEffect(oAllowoDeny) para una lista deActionsque son realizados porPrincipal(el usuario) en el especificadoResource(identificado por unAmazon Resource NameoARN).El
Ides sólo un ID de política opcional y elSides 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 Denieda todos mis archivos. La solución fue sencilla y simple.Services-S3Permissionspestaña, luego vaya a laBucket PolicypestañaSavebotón.Debería reasignar el permiso en todos sus archivos.
De todos modos, aquí está completo lo
bucket policyque permite hacer públicos todos los objetosfuente