Я использую библиотеку PHP для загрузки файла в мое ведро. Я установил ACL для public-read-write, и он работает нормально, но файл все еще закрыт.
Я обнаружил, что если я изменю Грантополучателя на Все, это делает файл общедоступным. То, что я хочу знать, - это как сделать Грантополучателем по умолчанию для всех объектов в моей корзине, чтобы он был установлен на «Все» . Или есть другое решение сделать файлы общедоступными по умолчанию?
Код, который я использую ниже:
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;
}
источник
Если вы хотите сделать все объекты общедоступными по умолчанию, самый простой способ - сделать это с помощью Bucket Policy вместо списков контроля доступа (ACL), определенных для каждого отдельного объекта.
Вы можете использовать AWS Policy Generator для генерации политики сегмента для вашего сегмента.
Например, следующая политика позволит любому читать каждый объект в вашей корзине S3 (просто замените
<bucket-name>
его именем):Политика Bucket содержит список
Statements
и каждый оператор имеетEffect
(илиAllow
илиDeny
) для списка того,Actions
что выполняетсяPrincipal
(пользователем) в указанномResource
(обозначаетсяAmazon Resource Name
илиARN
).Это
Id
просто необязательный идентификатор политики, аSid
необязательный уникальный идентификатор оператора.Для S3 Bucket Policies ресурсные ARN принимают форму:
Приведенный выше пример позволяет (
Effect: Allow
) любому (Principal: *
) получить доступ (Action: s3:GetObject
) к любому объекту в корзине (Resource: arn:aws:s3:::<bucket-name>/*
).источник
Principal: *
очень помог мне Спасибо!Моя проблема была немного другой, но так как этот вопрос находится на вершине поиска в Google, я оставлю свое решение, возможно, оно кому-нибудь поможет.
У меня уже был полный доступ к корзине S3, но однажды она только начала возвращаться
Access Denied
ко всем моим файлам. Решение было простым и простым.Services
-S3
Permissions
вкладку, затем перейти наBucket Policy
вкладкуSave
кнопку.Это должно переназначить разрешение на все ваши файлы.
Во всяком случае, здесь полно,
bucket policy
что позволяет сделать все объекты публичнымиисточник