Topik ini menjelaskan cara menggunakan metode UploadPartCopy di OSS SDK untuk PHP V2 untuk menyalin beberapa bagian dari objek sumber ke bucket tujuan dalam wilayah yang sama, kemudian menggabungkan bagian-bagian tersebut menjadi objek lengkap.
Catatan
Kode contoh dalam topik ini menggunakan wilayah China (Hangzhou) (
cn-hangzhou) sebagai contoh. Secara default, Titik akhir publik digunakan untuk mengakses sumber daya di bucket. Jika Anda ingin mengakses sumber daya di bucket dari layanan Alibaba Cloud lainnya dalam wilayah yang sama, Anda dapat menggunakan Titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir yang didukung oleh OSS, lihat Wilayah dan titik akhir OSS.Untuk menyalin objek, Anda harus memiliki izin baca pada objek sumber serta izin baca dan tulis pada bucket tujuan.
Penyalinan lintas wilayah tidak didukung. Sebagai contoh, Anda tidak dapat menyalin objek dari bucket di wilayah China (Hangzhou) ke bucket di wilayah China (Qingdao).
Saat menyalin objek, pastikan bahwa tidak ada kebijakan retensi yang dikonfigurasi untuk bucket sumber atau tujuan. Jika tidak, kesalahan Objek yang Anda tentukan tidak dapat diubah. akan dilaporkan.
Topik ini memberikan contoh cara memperoleh kredensial akses dari variabel lingkungan. Untuk lebih banyak contoh tentang cara mengonfigurasi kredensial akses, lihat Konfigurasikan kredensial akses untuk PHP.
Kode contoh
Gunakan kode berikut untuk menyalin beberapa bagian dari objek sumber ke bucket tujuan dan menggabungkannya menjadi objek lengkap.
<?php
// Sertakan file autoload untuk memastikan bahwa pustaka dependensi dimuat.
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// Tentukan deskripsi untuk argumen baris perintah.
$optsdesc = [
"region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True], // Wilayah tempat bucket berada. (Diperlukan)
"endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // Titik akhir. (Opsional)
"bucket" => ['help' => 'Nama bucket', 'required' => True], // Nama bucket tujuan. (Diperlukan)
"key" => ['help' => 'Nama objek', 'required' => True], // Nama objek tujuan. (Diperlukan)
"src-bucket" => ['help' => 'Nama bucket sumber', 'required' => False], // Nama bucket sumber. (Opsional)
"src-key" => ['help' => 'Nama objek sumber', 'required' => True], // Nama objek sumber. (Diperlukan)
];
// Ubah deskripsi argumen ke format opsi panjang yang diperlukan oleh getopt.
// Tambahkan tanda titik dua ":" setelah setiap argumen untuk menunjukkan bahwa argumen tersebut memerlukan nilai.
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// Parsing argumen baris perintah.
$options = getopt("", $longopts);
// Verifikasi bahwa argumen yang diperlukan ada.
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help']; // Dapatkan informasi bantuan untuk argumen.
echo "Error: argumen berikut diperlukan: --$key, $help" . PHP_EOL;
exit(1); // Jika argumen yang diperlukan hilang, keluar dari program.
}
}
// Ekstrak nilai dari argumen yang telah diparsing.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket tujuan.
$key = $options["key"]; // Nama objek tujuan.
$srcKey = $options["src-key"]; // Nama objek sumber.
// Muat informasi kredensial dari variabel lingkungan.
// Gunakan EnvironmentVariableCredentialsProvider untuk membaca Access Key ID dan Access Key Secret dari variabel lingkungan.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// Gunakan konfigurasi default dari SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Setel penyedia kredensial.
$cfg->setRegion($region); // Setel wilayah tempat bucket berada.
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // Jika titik akhir disediakan, setel titik akhir.
}
// Setel titik akhir default.
$cfg->setEndpoint('http://oss-cn-hangzhou.aliyuncs.com');
// Buat instance klien OSS.
$client = new Oss\Client($cfg);
// Inisialisasi tugas unggah multipart.
$initRequest = new Oss\Models\InitiateMultipartUploadRequest(bucket: $bucket, key: $key);
$initResult = $client->initiateMultipartUpload($initRequest);
// Tentukan nama bucket sumber.
if (!empty($options["src-bucket"])) {
$sourceBucket = $options["src-bucket"];
} else {
$sourceBucket = $bucket;
}
// Dapatkan metadata objek sumber.
$headResult = $client->headObject(new Oss\Models\HeadObjectRequest(
bucket: $sourceBucket,
key: $srcKey
));
// Dapatkan ukuran objek sumber.
$length = $headResult->contentLength;
// Tentukan ukuran bagian dan hitung jumlah bagian.
$partSize = 64 * 1024 * 1024; // Ukuran bagian dalam byte. Dalam contoh ini, ukuran bagian diatur menjadi 64 MB.
$partsNum = intdiv(num1: $length, num2: $partSize) + intval(1); // Hitung jumlah bagian dan bulatkan ke atas.
// Inisialisasi daftar bagian.
$parts = array();
// Lintasi setiap bagian dan lakukan operasi penyalinan bagian.
for ($i = 1; $i <= $partsNum; $i++) {
$partRequest = new Oss\Models\UploadPartCopyRequest(
bucket: $bucket,
key: $key,
partNumber: $i,
uploadId: $initResult->uploadId
);
// Setel rentang bagian.
$partRequest->sourceRange = getPartRange(totalSize: $length, partSize: $partSize, partNumber: $i);
// Setel nama bucket sumber (jika bucket sumber disediakan).
if (!empty($options["src-bucket"])) {
$partRequest->sourceBucket = $options["src-bucket"];
}
// Setel nama objek sumber.
$partRequest->sourceKey = $srcKey;
// Lakukan operasi penyalinan bagian.
$partResult = $client->uploadPartCopy($partRequest);
// Buat objek UploadPart dan tambahkan ke array bagian.
$part = new Oss\Models\UploadPart(
partNumber: $i,
etag: $partResult->etag,
);
array_push($parts, $part);
}
// Selesaikan tugas unggah multipart.
$comResult = $client->completeMultipartUpload(
new Oss\Models\CompleteMultipartUploadRequest(
bucket: $bucket,
key: $key,
uploadId: $initResult->uploadId,
completeMultipartUpload: new Oss\Models\CompleteMultipartUpload(
parts: $parts
),
)
);
// Cetak hasil unggah multipart yang selesai.
printf(
'kode status:' . $comResult->statusCode . PHP_EOL . // Kode status HTTP. Sebagai contoh, 200 menunjukkan sukses.
'ID permintaan:' . $comResult->requestId . PHP_EOL . // ID permintaan, yang digunakan untuk debug atau melacak permintaan.
'hasil:' . var_export($comResult, true) . PHP_EOL // Hasil rinci dari unggah multipart yang selesai.
);
/**
* Dapatkan rentang byte dari sebuah bagian.
*
* @param int $totalSize Ukuran total objek.
* @param int $partSize Ukuran bagian.
* @param int $partNumber Nomor bagian saat ini.
* @return string String rentang byte dari bagian.
*/
function getPartRange(int $totalSize, int $partSize, int $partNumber): string
{
$start = ($partNumber - 1) * $partSize; // Hitung posisi awal bagian.
$end = min($partNumber * $partSize - 1, $totalSize - 1); // Hitung posisi akhir bagian.
return sprintf('bytes %d-%d', $start, $end); // Format string sebagai rentang byte.
}
Referensi
Untuk kode contoh lengkap untuk salinan multipart, lihat Contoh Github.