Fitur unggah multi-bagian memungkinkan Anda membagi objek besar menjadi beberapa bagian. Setelah bagian-bagian tersebut diunggah, Anda dapat memanggil operasi CompleteMultipartUpload untuk menggabungkan bagian-bagian tersebut menjadi satu objek lengkap.
Catatan
Titik akhir publik untuk wilayah digunakan secara default dalam topik ini. Untuk mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal yang sesuai. Untuk informasi lebih lanjut tentang pemetaan antara Wilayah dan Titik akhir OSS, lihat Wilayah dan Titik Akhir OSS.
Unggah multi-bagian memerlukan izin
oss:PutObject. Untuk informasi lebih lanjut, lihat Memberikan Izin Kustom kepada Pengguna Resource Access Management (RAM).
Proses unggah multi-bagian
Unggah multi-bagian terdiri dari tiga langkah berikut:
Inisialisasi unggah multi-bagian.
Panggil metode Client.InitiateMultipartUpload untuk mendapatkan ID unggah unik untuk OSS.
Unggah bagian.
Panggil metode Client.UploadPart untuk mengunggah data bagian.
CatatanUntuk ID unggah tertentu, nomor bagian mengidentifikasi setiap bagian dan posisi relatifnya dalam objek akhir. Jika Anda mengunggah bagian baru dengan nomor bagian yang sudah ada, bagian asli akan ditimpa.
OSS menyertakan hash MD5 dari data bagian dalam header ETag dari tanggapan.
OSS menghitung hash MD5 dari data yang diunggah dan membandingkannya dengan hash yang dihitung oleh SDK.
Selesaikan unggah multi-bagian.
Panggil metode Client.CompleteMultipartUpload untuk menggabungkan bagian-bagian ini menjadi satu objek lengkap.
Kode contoh
Berikut adalah kode contoh yang menunjukkan cara membagi file lokal besar menjadi beberapa bagian, mengunggah bagian-bagian tersebut ke bucket, dan kemudian menggabungkan bagian-bagian tersebut menjadi satu objek lengkap:
import os
import argparse
import alibabacloud_oss_v2 as oss
# Buat parser parameter baris perintah untuk contoh unggah multi-bagian.
parser = argparse.ArgumentParser(description="contoh unggah multi-bagian")
# Parameter --region yang diperlukan, yang menentukan wilayah tempat bucket berada.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Parameter --bucket yang diperlukan, yang menentukan nama bucket.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Parameter --endpoint opsional, yang menentukan titik akhir yang dapat digunakan layanan lain untuk mengakses OSS.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Parameter --key yang diperlukan, yang menentukan nama objek.
parser.add_argument('--key', help='Nama objek.', required=True)
# Parameter --file_path yang diperlukan, yang menentukan jalur file yang akan diunggah.
parser.add_argument('--file_path', help='Jalur file unggahan.', required=True)
def main():
# Parsing parameter baris perintah.
args = parser.parse_args()
# Dapatkan kredensial akses dari variabel lingkungan untuk otentikasi.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Gunakan konfigurasi default SDK dan atur penyedia kredensial.
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# Tentukan wilayah tempat bucket berada.
cfg.region = args.region
# Jika titik akhir disediakan, tentukan titik akhir dalam objek konfigurasi.
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# Gunakan konfigurasi untuk membuat instance OSSClient.
client = oss.Client(cfg)
# Mulai unggah multi-bagian dan dapatkan ID unggah.
result = client.initiate_multipart_upload(oss.InitiateMultipartUploadRequest(
bucket=args.bucket,
key=args.key,
))
# Tentukan ukuran setiap bagian sebagai 5MB.
part_size = 5 * 1024 * 1024
# Dapatkan ukuran total objek yang akan diunggah.
data_size = os.path.getsize(args.file_path)
# Inisialisasi nomor bagian, mulai dari 1.
part_number = 1
# Simpan informasi bagian yang diunggah.
upload_parts = []
# Buka file dalam mode biner untuk dibaca.
with open(args.file_path, 'rb') as f:
# Lintasi file dan unggah dalam bagian berdasarkan part_size.
for start in range(0, data_size, part_size):
n = part_size
if start + n > data_size: # Tangani kasus di mana bagian terakhir mungkin lebih kecil dari part_size.
n = data_size - start
# Buat SectionReader untuk membaca bagian tertentu dari file.
reader = oss.io_utils.SectionReader(oss.io_utils.ReadAtReader(f), start, n)
# Unggah bagian.
up_result = client.upload_part(oss.UploadPartRequest(
bucket=args.bucket,
key=args.key,
upload_id=result.upload_id,
part_number=part_number,
body=reader
))
# Keluarkan hasil unggah setiap bagian.
print(f'kode status: {up_result.status_code},'
f' ID permintaan: {up_result.request_id},'
f' nomor bagian: {part_number},'
f' konten md5: {up_result.content_md5},'
f' etag: {up_result.etag},'
f' hash crc64: {up_result.hash_crc64},'
)
# Simpan hasil unggah bagian ke daftar.
upload_parts.append(oss.UploadPart(part_number=part_number, etag=up_result.etag))
# Tambahkan nomor bagian.
part_number += 1
# Urutkan bagian yang diunggah berdasarkan nomor bagian.
parts = sorted(upload_parts, key=lambda p: p.part_number)
# Kirim permintaan untuk menyelesaikan unggah multi-bagian dan menggabungkan semua bagian menjadi satu objek lengkap.
result = client.complete_multipart_upload(oss.CompleteMultipartUploadRequest(
bucket=args.bucket,
key=args.key,
upload_id=result.upload_id,
complete_multipart_upload=oss.CompleteMultipartUpload(
parts=parts
)
))
# Kode berikut adalah pendekatan lain yang menggunakan metode daftar sisi server untuk menggabungkan semua data bagian menjadi satu objek lengkap.
# Metode ini cocok jika Anda tidak yakin apakah semua bagian telah berhasil diunggah.
# Gabungkan data terfragmentasi menjadi Objek lengkap melalui metode Daftar sisi server
# result = client.complete_multipart_upload(oss.CompleteMultipartUploadRequest(
# bucket=args.bucket,
# key=args.key,
# upload_id=result.upload_id,
# complete_all='yes'
# ))
# Keluarkan informasi hasil unggah multi-bagian yang selesai.
print(f'kode status: {result.status_code},'
f' ID permintaan: {result.request_id},'
f' bucket: {result.bucket},'
f' kunci: {result.key},'
f' lokasi: {result.location},'
f' etag: {result.etag},'
f' jenis pengkodean: {result.encoding_type},'
f' hash crc64: {result.hash_crc64},'
f' ID versi: {result.version_id},'
)
if __name__ == "__main__":
main() # Titik masuk skrip. Saat skrip dijalankan langsung, fungsi utama dipanggil.Skenario umum
Referensi
Untuk kode contoh lengkap unggah multi-bagian, lihat complete_multipart_upload.py.