J'utilise une bibliothèque PHP pour télécharger un fichier dans mon bucket. J'ai mis l'ACL sur public-read-write et cela fonctionne bien mais le fichier est toujours privé.
J'ai constaté que si je change le bénéficiaire en Tout le monde , le fichier devient public. Ce que je veux savoir, c'est comment faire pour que le bénéficiaire par défaut de tous les objets de mon compartiment soit défini sur «Tout le monde» . Ou existe-t-il une autre solution pour rendre les fichiers publics par défaut?
Le code que j'utilise est ci-dessous:
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;
}
la source
Si vous souhaitez rendre tous les objets publics par défaut, le moyen le plus simple est de le faire via une stratégie de compartiment au lieu de listes de contrôle d'accès (ACL) définies sur chaque objet individuel.
Vous pouvez utiliser AWS Policy Generator pour générer une stratégie de compartiment pour votre compartiment.
Par exemple, la stratégie suivante permettra à quiconque de lire chaque objet de votre compartiment S3 (remplacez-le simplement
<bucket-name>
par le nom de votre compartiment):La stratégie de compartiment contient une liste de
Statements
et chaque instruction a unEffect
(ouAllow
ouDeny
) pour une liste de ceuxActions
qui sont exécutés parPrincipal
(l'utilisateur) sur le spécifiéResource
(identifié par unAmazon Resource Name
ouARN
).Le
Id
est juste un identifiant de stratégie facultatif et leSid
est un identifiant d'instruction unique facultatif.Pour les stratégies de compartiment S3, les ARN de ressources prennent la forme:
L'exemple ci-dessus permet à ( ) any
Effect: Allow
(Principal: *
) d'accéder (Action: s3:GetObject
) à n'importe quel objet du bucket (Resource: arn:aws:s3:::<bucket-name>/*
).la source
Principal: *
m'a beaucoup aidé. Merci!Mon problème était légèrement différent, mais comme cette question est en haut de la recherche Google, je laisse ma solution, peut-être qu'elle aidera quelqu'un.
J'avais déjà eu un accès complet au compartiment S3 auparavant, mais un jour, il a juste commencé à revenir
Access Denied
à tous mes fichiers. La solution était simple et directe.Services
-S3
Permissions
onglet, puis aller à l'Bucket Policy
ongletSave
bouton.Il devrait réaffecter l'autorisation sur tous vos fichiers.
Quoi qu'il en soit, voici plein
bucket policy
qui permet de rendre tous les objets publicsla source