Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menggunakan unggahan multipart Amazon S3 dengan Versi 3 AWS SDK for PHP
Dengan satu PutObject
operasi, Anda dapat mengunggah objek hingga 5 GB. Namun, dengan menggunakan metode upload multipart (misalnya,,, CreateMultipartUpload
UploadPart
,AbortMultipartUpload
)CompleteMultipartUpload
, Anda dapat mengunggah objek dari ukuran 5 MB hingga 5 TB.
Contoh berikut menunjukkan cara:
-
Unggah objek ke Amazon S3, menggunakan. ObjectUploader
-
Buat unggahan multibagian untuk objek Amazon S3 menggunakan. MultipartUploader
-
Salin objek dari satu lokasi Amazon S3 ke lokasi lain menggunakan. ObjectCopier
Semua kode contoh untuk AWS SDK for PHP tersedia di sini GitHub
Kredensial
Sebelum menjalankan kode contoh, konfigurasikan AWS kredensil Anda, seperti yang dijelaskan dalam. Kredensial Kemudian impor AWS SDK for PHP, seperti yang dijelaskan dalamPenggunaan dasar.
Pengunggah objek
Jika Anda tidak yakin apakah PutObject
atau MultipartUploader
yang terbaik untuk tugas itu, gunakanObjectUploader
. ObjectUploader
mengunggah file besar ke Amazon S3 menggunakan PutObject
salah satu MultipartUploader
atau, tergantung pada apa yang terbaik berdasarkan ukuran payload.
require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\ObjectUploader; use Aws\S3\S3Client;
Kode Sampel
// Create an S3Client. $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-east-2', 'version' => '2006-03-01' ]); $bucket = 'your-bucket'; $key = 'my-file.zip'; // Use a stream instead of a file path. $source = fopen('/path/to/large/file.zip', 'rb'); $uploader = new ObjectUploader( $s3Client, $bucket, $key, $source ); do { try { $result = $uploader->upload(); if ($result["@metadata"]["statusCode"] == '200') { print('<p>File successfully uploaded to ' . $result["ObjectURL"] . '.</p>'); } print($result); // If the SDK chooses a multipart upload, try again if there is an exception. // Unlike PutObject calls, multipart upload calls are not automatically retried. } catch (MultipartUploadException $e) { rewind($source); $uploader = new MultipartUploader($s3Client, $source, [ 'state' => $e->getState(), ]); } } while (!isset($result)); fclose($source);
Konfigurasi
Konstruktor ObjectUploader
objek menerima argumen berikut:
$client
-
Aws\ClientInterface
Objek yang digunakan untuk melakukan transfer. Ini harus menjadi contoh dariAws\S3\S3Client
. $bucket
-
(
string
, wajib) Nama ember tempat objek diunggah. $key
-
(
string
, wajib) Kunci yang akan digunakan untuk objek yang sedang diunggah. $body
-
(
mixed
, wajib) Data objek untuk diunggah. Dapat berupaStreamInterface
, sumber daya PHP aliran, atau serangkaian data untuk diunggah. $acl
-
(
string
) Access control list (ACL) untuk mengatur objek yang sedang diunggah. Objek bersifat pribadi secara default. $options
-
Array asosiatif opsi konfigurasi untuk unggahan multipart. Opsi konfigurasi berikut valid:
add_content_md5
-
(
bool
) Setel ke true untuk secara otomatis menghitung MD5 checksum untuk unggahan. mup_threshold
-
(
int
, default:int(16777216)
) Jumlah byte untuk ukuran file. Jika ukuran file melebihi batas ini, unggahan multibagian digunakan. before_complete
-
(
callable
) Callback untuk memanggil sebelum operasi.CompleteMultipartUpload
Callback harus memiliki tanda tangan fungsi yang mirip dengan:function (Aws\Command $command) {...}
. Lihat CompleteMultipartUpload APIreferensi untuk parameter yang dapat Anda tambahkan keCommandInterface
objek. before_initiate
-
(
callable
) Callback untuk memanggil sebelum operasi.CreateMultipartUpload
Callback harus memiliki tanda tangan fungsi yang mirip dengan:function (Aws\Command $command) {...}
. SDKMemanggil callback ini jika ukuran file melebihi nilai.mup_threshold
Lihat CreateMultipartUpload APIreferensi untuk parameter yang dapat Anda tambahkan keCommandInterface
objek. before_upload
-
(
callable
) Panggilan balik untuk memanggil sebelum operasi apa punPutObject
atauUploadPart
. Callback harus memiliki tanda tangan fungsi yang mirip dengan:function (Aws\Command $command) {...}
. SDKMemanggil callback ini jika ukuran file kurang dari atau sama dengan nilai.mup_threshold
Lihat PutObject APIreferensi untuk parameter yang dapat Anda terapkan padaPutObject
permintaan. Untuk parameter yang berlaku untukUploadPart
permintaan, lihat UploadPart APIreferensi. SDKMengabaikan parameter apa pun yang tidak berlaku untuk operasi yang diwakili olehCommandInterface
objek. concurrency
-
(
int
, default:int(3)
) Jumlah maksimumUploadPart
operasi bersamaan yang diizinkan selama pengunggahan multibagian. part_size
-
(
int
, default:int(5242880)
) Ukuran bagian, dalam byte, untuk digunakan saat melakukan unggahan multibagian. Nilai harus antara 5 MB dan 5 GB, inklusif. state
-
(
Aws\Multipart\UploadState
) Objek yang mewakili status unggahan multibagian dan yang digunakan untuk melanjutkan unggahan sebelumnya. Ketika opsi ini disediakan,$key
argumen$bucket
and danpart_size
opsi diabaikan.
MultipartUploader
Unggahan multipart dirancang untuk meningkatkan pengalaman mengunggah objek yang lebih besar. Mereka memungkinkan Anda untuk mengunggah objek dalam beberapa bagian secara independen, dalam urutan apa pun, dan secara paralel.
Pelanggan Amazon S3 didorong untuk menggunakan unggahan multipart untuk objek yang lebih besar dari 100 MB.
MultipartUploader objek
SDKMemiliki MultipartUploader
objek khusus yang menyederhanakan proses upload multipart.
Impor
require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;
Kode Sampel
$s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); // Use multipart upload $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); try { $result = $uploader->upload(); echo "Upload complete: {$result['ObjectURL']}\n"; } catch (MultipartUploadException $e) { echo $e->getMessage() . "\n"; }
Pengunggah membuat generator data bagian, berdasarkan sumber dan konfigurasi yang disediakan, dan mencoba mengunggah semua bagian. Jika beberapa bagian unggahan gagal, pengunggah terus mengunggah bagian selanjutnya hingga seluruh data sumber dibaca. Setelah itu, pengunggah mencoba lagi untuk mengunggah bagian yang gagal atau melempar pengecualian yang berisi informasi tentang bagian yang gagal diunggah.
Menyesuaikan unggahan multipart
Anda dapat mengatur opsi kustom padaCreateMultipartUpload
,UploadPart
, dan CompleteMultipartUpload
operasi yang dijalankan oleh pengunggah multibagian melalui panggilan balik yang diteruskan ke konstruktornya.
Impor
require 'vendor/autoload.php'; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;
Kode Sampel
// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); // Customizing a multipart upload $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', 'before_initiate' => function (Command $command) { // $command is a CreateMultipartUpload operation $command['CacheControl'] = 'max-age=3600'; }, 'before_upload' => function (Command $command) { // $command is an UploadPart operation $command['RequestPayer'] = 'requester'; }, 'before_complete' => function (Command $command) { // $command is a CompleteMultipartUpload operation $command['RequestPayer'] = 'requester'; }, ]);
Pengumpulan sampah manual antara unggahan bagian
Jika Anda mencapai batas memori dengan unggahan besar, ini mungkin karena referensi siklik yang dihasilkan oleh SDK belum dikumpulkan oleh pengumpul PHP sampah
$uploader = new MultipartUploader($client, $source, [ 'bucket' => 'your-bucket', 'key' => 'your-key', 'before_upload' => function(\Aws\Command $command) { gc_collect_cycles(); } ]);
Memulihkan dari kesalahan
Ketika terjadi kesalahan selama proses pengunggahan multipart, a MultipartUploadException
dilemparkan. Pengecualian ini menyediakan akses ke UploadState
objek, yang berisi informasi tentang kemajuan unggahan multibagian. UploadState
Dapat digunakan untuk melanjutkan unggahan yang gagal diselesaikan.
Impor
require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;
Kode Sampel
// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); //Recover from errors do { try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { $uploader = new MultipartUploader($s3Client, $source, [ 'state' => $e->getState(), ]); } } while (!isset($result)); //Abort a multipart upload if failed try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { // State contains the "Bucket", "Key", and "UploadId" $params = $e->getState()->getId(); $result = $s3Client->abortMultipartUpload($params); }
Melanjutkan unggahan dari UploadState
upaya untuk mengunggah bagian yang belum diunggah. Objek negara melacak bagian yang hilang, bahkan jika mereka tidak berurutan. Pengunggah membaca atau mencari melalui file sumber yang disediakan ke rentang byte milik bagian yang masih perlu diunggah.
UploadState
objek dapat diserialkan, sehingga Anda juga dapat melanjutkan unggahan dalam proses yang berbeda. Anda juga bisa mendapatkan UploadState
objek, bahkan ketika Anda tidak menangani pengecualian, dengan menelepon$uploader->getState()
.
penting
Aliran yang diteruskan sebagai sumber ke a tidak MultipartUploader
diputar ulang secara otomatis sebelum mengunggah. Jika Anda menggunakan aliran alih-alih jalur file dalam loop yang mirip dengan contoh sebelumnya, setel ulang $source
variabel di dalam catch
blok.
Impor
require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;
Kode Sampel
// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); //Using stream instead of file path $source = fopen('/path/to/large/file.zip', 'rb'); $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); do { try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { rewind($source); $uploader = new MultipartUploader($s3Client, $source, [ 'state' => $e->getState(), ]); } } while (!isset($result)); fclose($source);
Membatalkan unggahan multibagian
Unggahan multipart dapat dibatalkan dengan mengambil yang UploadId
terkandung dalam UploadState
objek dan meneruskannya ke. abortMultipartUpload
try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { // State contains the "Bucket", "Key", and "UploadId" $params = $e->getState()->getId(); $result = $s3Client->abortMultipartUpload($params); }
Unggahan multipart asinkron
Memanggil upload()
MultipartUploader
adalah permintaan pemblokiran. Jika Anda bekerja dalam konteks asinkron, Anda bisa mendapatkan janji untuk unggahan multibagian.
require 'vendor/autoload.php'; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;
Kode Sampel
// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); $promise = $uploader->promise();
Konfigurasi
Konstruktor MultipartUploader
objek menerima argumen berikut:
-
$client
-
Aws\ClientInterface
Objek yang digunakan untuk melakukan transfer. Ini harus menjadi contoh dariAws\S3\S3Client
. -
$source
-
Sumber data yang sedang diunggah. Ini bisa berupa jalur atau URL (misalnya,
/path/to/file.jpg
), pegangan sumber daya (misalnya,fopen('/path/to/file.jpg', 'r)
), atau instance aliran PSR -7. -
$config
-
Array asosiatif opsi konfigurasi untuk unggahan multipart.
Opsi konfigurasi berikut valid:
-
acl
-
(
string
) Access control list (ACL) untuk mengatur objek yang sedang diunggah. Objek bersifat pribadi secara default. -
before_complete
-
(
callable
) Callback untuk memanggil sebelum operasi.CompleteMultipartUpload
Callback harus memiliki tanda tangan fungsi sepertifunction (Aws\Command $command) {...}
. -
before_initiate
-
(
callable
) Callback untuk memanggil sebelum operasi.CreateMultipartUpload
Callback harus memiliki tanda tangan fungsi sepertifunction (Aws\Command $command) {...}
. -
before_upload
-
(
callable
) Callback untuk memanggil sebelum operasi apa punUploadPart
. Callback harus memiliki tanda tangan fungsi sepertifunction (Aws\Command $command) {...}
. -
bucket
-
(
string
, wajib) Nama ember tempat objek diunggah. -
concurrency
-
(
int
, default:int(5)
) Jumlah maksimumUploadPart
operasi bersamaan yang diizinkan selama pengunggahan multibagian. -
key
-
(
string
, wajib) Kunci yang akan digunakan untuk objek yang sedang diunggah. -
part_size
-
(
int
, default:int(5242880)
) Ukuran bagian, dalam byte, untuk digunakan saat melakukan unggahan multibagian. Ini harus antara 5 MB dan 5 GB, inklusif. -
state
-
(
Aws\Multipart\UploadState
) Objek yang mewakili status unggahan multibagian dan yang digunakan untuk melanjutkan unggahan sebelumnya. Ketika opsi ini disediakan,part_size
opsibucket
key
,, dan diabaikan. add_content_md5
-
(
boolean
) Setel ke true untuk secara otomatis menghitung MD5 checksum untuk unggahan.
-
Salinan multipart
Ini AWS SDK for PHP juga mencakup MultipartCopy
objek yang digunakan dengan cara yang mirip denganMultipartUploader
, tetapi dirancang untuk menyalin objek antara 5 GB dan 5 TB dalam ukuran dalam Amazon S3.
require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartCopy; use Aws\S3\S3Client;
Kode Sampel
// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); //Copy objects within S3 $copier = new MultipartCopy($s3Client, '/bucket/key?versionId=foo', [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); try { $result = $copier->copy(); echo "Copy complete: {$result['ObjectURL']}\n"; } catch (MultipartUploadException $e) { echo $e->getMessage() . "\n"; }