全部产品
Search
文档中心

Object Storage Service:Penyalinan multipart menggunakan OSS SDK untuk Python 2.0

更新时间:Oct 21, 2025

Topik ini menjelaskan cara menggunakan metode UploadPartCopy dari OSS SDK untuk Python 2.0 guna menyalin bagian-bagian objek dari bucket sumber dan menggabungkannya menjadi objek baru yang lengkap di bucket tujuan. Bucket sumber dan tujuan dapat sama atau berbeda, tetapi harus berada dalam wilayah yang sama.

Catatan penggunaan

  • Kode contoh dalam topik ini menggunakan ID Wilayah cn-hangzhou dari Wilayah China (Hangzhou). 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 di wilayah yang sama dengan bucket tersebut, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir yang didukung oleh OSS, lihat Wilayah dan Titik Akhir.

  • Untuk menyalin objek, Anda memerlukan izin baca pada objek sumber serta izin baca dan tulis pada bucket tujuan.

  • Bucket sumber dan tujuan harus berada dalam wilayah yang sama. Sebagai contoh, objek di bucket yang terletak di Wilayah China (Hangzhou) tidak dapat disalin ke bucket yang terletak di Wilayah China (Qingdao).

  • Pastikan tidak ada kebijakan retensi yang dikonfigurasi untuk bucket sumber dan tujuan. Jika tidak, pesan kesalahan berikut akan dikembalikan: Objek yang Anda tentukan tidak dapat diubah.

Metode

upload_part_copy(request: UploadPartCopyRequest, **kwargs) → UploadPartCopyResult

Parameter permintaan

Parameter

Tipe

Deskripsi

request

UploadPartCopyRequest

Parameter permintaan. Untuk informasi lebih lanjut, lihat UploadPartCopyRequest

Parameter respons

Tipe

Deskripsi

UploadPartCopyResult

Nilai kembali. Untuk informasi lebih lanjut, lihat UploadPartCopyResult

Untuk definisi lengkap metode penyalinan multipart, lihat upload_part_copy.

Proses penyalinan multipart

Untuk mengunggah file lokal menggunakan unggah multipart, ikuti langkah-langkah berikut:

  1. Mulai tugas unggah multipart.

    Gunakan metode client.initiate_multipart_upload untuk mendapatkan ID unggah unik di OSS.

  2. Unggah bagian-bagian.

    Gunakan metode client.upload_part_copy untuk mendapatkan ID unggah unik di OSS.

    Catatan
    • Untuk bagian-bagian yang diunggah dengan menjalankan tugas unggah multipart menggunakan ID unggah tertentu, nomor bagian menunjukkan posisi relatif mereka dalam objek. Jika Anda mengunggah bagian dan menggunakan kembali nomor bagiannya untuk mengunggah bagian lain, bagian baru akan menimpa bagian asli.

    • OSS menyertakan hash MD5 dari data bagian dalam header ETag dan mengembalikan hash MD5 kepada pengguna.

    • OSS menghitung hash MD5 dari bagian yang diunggah dan membandingkan hash MD5 dengan hash MD5 yang dihitung menggunakan OSS SDK for Harmony. Jika kedua hash berbeda, OSS mengembalikan kode kesalahan InvalidDigest.

  3. Selesaikan tugas unggah multipart.

    Gabungkan bagian-bagian yang diunggah menjadi objek menggunakan metode client.complete_multipart_upload.

Kode contoh

Berikut adalah kode contoh yang mengilustrasikan cara menyalin objek dari bucket sumber ke bucket tujuan menggunakan penyalinan multipart dan menggabungkan bagian-bagiannya menjadi objek lengkap:

import argparse
import alibabacloud_oss_v2 as oss

# Buat parser argumen baris perintah dan jelaskan tujuan skrip: contoh penyalinan multipart sinkron
parser = argparse.ArgumentParser(description="contoh penyalinan multipart sinkron")

# Tambahkan parameter baris perintah --region, yang menunjukkan wilayah tempat bucket berada. Parameter ini wajib.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tambahkan parameter baris perintah --bucket, yang menunjukkan nama bucket tujuan tempat objek akan diunggah. Parameter ini wajib.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Tambahkan parameter baris perintah --endpoint, yang menunjukkan nama domain yang dapat digunakan layanan lain untuk mengakses OSS. Parameter ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Tambahkan parameter baris perintah --key, yang menunjukkan kunci objek tujuan di OSS. Parameter ini wajib.
parser.add_argument('--key', help='Nama objek.', required=True)
# Tambahkan parameter baris perintah --source_bucket, yang menunjukkan nama bucket tempat objek sumber berada. Parameter ini wajib.
parser.add_argument('--source_bucket', help='Nama bucket sumber.', required=True)
# Tambahkan parameter baris perintah --source_key, yang menunjukkan kunci objek sumber di OSS. Parameter ini wajib.
parser.add_argument('--source_key', help='Nama objek sumber.', required=True)

def main():
    # Parsing parameter yang diberikan di baris perintah untuk mendapatkan nilai yang dimasukkan oleh pengguna.
    args = parser.parse_args()

    # Muat informasi autentikasi yang diperlukan untuk mengakses OSS dari variabel lingkungan untuk verifikasi identitas.
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Gunakan konfigurasi default dari SDK untuk membuat objek konfigurasi dan atur penyedia autentikasi.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region

    # Jika titik akhir kustom diberikan, perbarui properti endpoint di objek konfigurasi.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Gunakan konfigurasi sebelumnya untuk menginisialisasi klien OSS dan bersiaplah untuk berinteraksi dengan OSS.
    client = oss.Client(cfg)

    # Dapatkan metadata objek sumber.
    result_meta = client.get_object_meta(oss.GetObjectMetaRequest(
        bucket=args.source_bucket,
        key=args.source_key,
    ))

    # Inisialisasi permintaan unggah multipart dan kembalikan ID unggah untuk mengidentifikasi proses.
    result = client.initiate_multipart_upload(oss.InitiateMultipartUploadRequest(
        bucket=args.bucket,
        key=args.key,
    ))

    # Tentukan ukuran setiap bagian. Dalam contoh ini, ukuran diatur menjadi 1 MB.
    part_size = 1024 * 1024
    total_size = result_meta.content_length  # Ukuran total file sumber.
    part_number = 1  # Nomor bagian mulai dari 1.
    upload_parts = []  # Digunakan untuk menyimpan informasi bagian yang diunggah.
    offset = 0  # Offset byte saat ini.

    # Loop hingga semua data diunggah.
    while offset < total_size:
        num_to_upload = min(part_size, total_size - offset)  # Hitung jumlah data yang akan diunggah kali ini.
        end = offset + num_to_upload - 1  # Tentukan posisi akhir.

        # Lakukan operasi penyalinan multipart dan unggah yang sebenarnya.
        up_result = client.upload_part_copy(oss.UploadPartCopyRequest(
            bucket=args.bucket,
            key=args.key,
            upload_id=result.upload_id,
            part_number=part_number,
            source_bucket=args.source_bucket,
            source_key=args.source_key,
            source_range=f'bytes={offset}-{end}',  # Tentukan rentang di objek sumber.
        ))

        # Cetak informasi status bagian yang diunggah.
        print(f'status code: {up_result.status_code},'
              f' request id: {up_result.request_id},'
              f' part number: {part_number},'
              f' last modified: {up_result.last_modified},'
              f' etag: {up_result.etag},'
              f' source version id: {up_result.source_version_id}'
        )

        # Catat informasi bagian yang berhasil diunggah.
        upload_parts.append(oss.UploadPart(part_number=part_number, etag=up_result.etag))
        offset += num_to_upload  # Perbarui offset.
        part_number += 1  # Perbarui nomor bagian.

    # Urutkan semua bagian yang diunggah berdasarkan nomor bagian.
    parts = sorted(upload_parts, key=lambda p: p.part_number)

    # Kirim permintaan ke layanan OSS untuk menyelesaikan unggah multipart.
    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
        )
    ))

    # Cetak hasil rinci setelah unggah selesai.
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' bucket: {result.bucket},'
          f' key: {result.key},'
          f' location: {result.location},'
          f' etag: {result.etag},'
          f' encoding type: {result.encoding_type},'
          f' hash crc64: {result.hash_crc64},'
          f' version id: {result.version_id}'
    )

# Saat skrip ini dijalankan langsung, panggil fungsi utama untuk memulai pemrosesan logika.
if __name__ == "__main__":
    main()  # Titik masuk skrip. Alur program dimulai dari sini.

Referensi