Saya menggunakan perpustakaan PHP untuk mengunggah file ke ember saya. Saya telah mengatur ACL ke publik-baca-tulis dan berfungsi baik tetapi file tersebut masih pribadi.
Saya menemukan bahwa jika saya mengubah Penerima Hibah ke Semua Orang, ini membuat file menjadi publik. Yang ingin saya ketahui adalah bagaimana cara membuat Penerima Default pada semua objek di keranjang saya untuk disetel ke "Semua Orang" . Atau apakah ada solusi lain untuk membuat file publik secara default?
Kode yang saya gunakan adalah di bawah ini:
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;
}
sumber
Jika Anda ingin menjadikan semua objek publik secara default, cara termudah adalah melakukannya melalui Kebijakan Bucket alih-alih Daftar Kontrol Akses (ACL) yang ditentukan pada masing-masing objek.
Anda dapat menggunakan Pembuat Kebijakan AWS untuk menghasilkan kebijakan ember untuk ember Anda.
Misalnya, kebijakan berikut akan memungkinkan siapa saja untuk membaca setiap objek di bucket S3 Anda (cukup ganti
<bucket-name>
dengan nama bucket Anda):Kebijakan Bucket berisi daftar
Statements
dan setiap pernyataan memilikiEffect
(salah satuAllow
atauDeny
) untuk daftarActions
yang dilakukan olehPrincipal
(pengguna) pada yang ditentukanResource
(diidentifikasi olehAmazon Resource Name
atauARN
).Ini
Id
hanya id kebijakan opsional danSid
id pernyataan unik opsional.Untuk Kebijakan S3 Bucket, Resource ARN mengambil formulir:
Contoh di atas memungkinkan (
Effect: Allow
) siapa saja (Principal: *
) untuk mengakses (Action: s3:GetObject
) objek apa pun dalam ember (Resource: arn:aws:s3:::<bucket-name>/*
).sumber
Principal: *
banyak membantu saya. Terima kasih!Masalah saya sedikit berbeda, tetapi karena pertanyaan ini ada di bagian atas pencarian google saya akan meninggalkan solusi saya, mungkin itu akan membantu seseorang.
Saya sudah memiliki akses penuh ke bucket S3 sebelumnya, tetapi suatu hari itu baru saja mulai kembali
Access Denied
ke semua file saya. Solusinya sangat sederhana.Services
-S3
Permissions
tab, lalu bukaBucket Policy
tabSave
tombolnya.Seharusnya menetapkan ulang izin pada semua file Anda.
Bagaimanapun, di sini penuh
bucket policy
yang memungkinkan membuat semua objek publiksumber