All Products
Search
Document Center

Object Storage Service:Unggah multi-bagian menggunakan OSS SDK untuk Python 1.0

Last Updated:Mar 01, 2026

Unggah multi-bagian membagi objek besar menjadi bagian-bagian kecil yang diunggah secara independen, lalu digabungkan menjadi satu objek. Gunakan unggah multi-bagian untuk objek yang lebih besar dari 5 GB atau ketika gangguan jaringan dan crash program berpotensi mengganggu proses unggah tunggal.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Bucket OSS

  • Izin oss:PutObject yang dilampirkan pada RAM user Anda. Izin ini mencakup seluruh alur kerja unggah multi-bagian: InitiateMultipartUpload, UploadPart, dan CompleteMultipartUpload. Untuk detailnya, lihat Lampirkan kebijakan kustom ke RAM user.

  • Variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET yang telah dikonfigurasi. Untuk informasi selengkapnya, lihat Konfigurasikan kredensial akses menggunakan OSS SDK untuk Python 1.0.

  • Titik akhir OSS. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya tentang wilayah dan titik akhir OSS, lihat Wilayah dan titik akhir.

  • OSS SDK untuk Python 1.0 yang telah diinstal. Untuk konfigurasi alternatif, seperti menggunakan domain kustom atau mengautentikasi dengan kredensial dari Security Token Service (STS), lihat Inisialisasi.

Cara kerja

Unggah multi-bagian terdiri dari tiga tahap:

  1. Initiate — Panggil bucket.init_multipart_upload() untuk mendapatkan ID unggah unik dari OSS.

  2. Upload parts — Panggil bucket.upload_part() untuk setiap bagian. Bagian-bagian tersebut dapat diunggah secara paralel.

  3. Complete — Panggil bucket.complete_multipart_upload() untuk menggabungkan semua bagian menjadi satu objek.

Nomor bagian masing-masing menunjukkan posisi bagian tersebut dalam objek akhir. Mengunggah bagian baru dengan nomor bagian yang sudah ada akan menimpa bagian sebelumnya.

Verifikasi integritas data

OSS menyertakan hash MD5 dari setiap bagian yang diunggah dalam header ETag pada respons. Saat SDK mengirim header Content-MD5 bersama permintaan unggah, OSS menghitung hash MD5 dari data yang diterima dan membandingkannya dengan nilai Content-MD5. Jika hash tidak cocok, OSS mengembalikan kode kesalahan InvalidDigest.

Batasan ukuran bagian

BatasanNilai
Ukuran bagian minimum100 KB
Ukuran bagian maksimum5 GB
Bagian terakhirBoleh lebih kecil dari 100 KB
Penting

Tingkatkan ukuran bagian pada jaringan yang stabil untuk mengurangi jumlah panggilan API. Kurangi ukuran bagian pada jaringan yang tidak andal untuk mengurangi biaya pengiriman ulang bagian yang gagal.

Unggah objek menggunakan unggah multi-bagian

Contoh berikut mengunggah file lokal menggunakan unggah multi-bagian. Fungsi bantu determine_part_size() menghitung ukuran bagian yang sesuai berdasarkan ukuran total file.

# -*- coding: utf-8 -*-
import os
from oss2 import SizedFileAdapter, determine_part_size
from oss2.models import PartInfo
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# Tentukan ID wilayah yang sesuai dengan titik akhir. Contoh: cn-hangzhou. Parameter ini wajib jika Anda menggunakan algoritma signature V4.
region = "cn-hangzhou"

# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampledir/exampleobject.txt.
key = 'exampledir/exampleobject.txt'
# Tentukan path lengkap file lokal yang ingin diunggah. Contoh: D:\\localpath\\examplefile.txt.
filename = 'D:\\localpath\\examplefile.txt'

total_size = os.path.getsize(filename)
# Gunakan metode determine_part_size untuk menentukan ukuran bagian. Ukuran bagian minimum adalah 100 KB dan maksimum 5 GB. Bagian terakhir boleh lebih kecil dari 100 KB. Pada contoh ini, ukuran bagian diatur menjadi 1 MB.
part_size = determine_part_size(total_size, preferred_size=1 * 1024 * 1024)

# Mulai tugas unggah multi-bagian.
upload_id = bucket.init_multipart_upload(key).upload_id
parts = []

# Unggah bagian-bagiannya.
with open(filename, 'rb') as fileobj:
    part_number = 1
    offset = 0
    while offset < total_size:
        num_to_upload = min(part_size, total_size - offset)
        # Gunakan metode SizedFileAdapter(fileobj, size) untuk menghasilkan objek baru dan menghitung ulang posisi awal operasi append.
        result = bucket.upload_part(key, upload_id, part_number,
                                    SizedFileAdapter(fileobj, num_to_upload))
        parts.append(PartInfo(part_number, result.etag))

        offset += num_to_upload
        part_number += 1

# Selesaikan tugas unggah multi-bagian.
bucket.complete_multipart_upload(key, upload_id, parts)

Atur header opsional

Atur header saat memulai unggah multi-bagian untuk mengontrol metadata objek, enkripsi, dan kelas penyimpanan:

headers = dict()
# Perilaku cache
# headers['Cache-Control'] = 'no-cache'
# Nama file saat diunduh
# headers['Content-Disposition'] = 'oss_MultipartUpload.txt'
# Masa berlaku (milidetik)
# headers['Expires'] = '1000'
# Cegah penimpaan objek yang sudah ada dengan nama yang sama (true = larang menimpa)
# headers['x-oss-forbid-overwrite'] = 'true'
# Metode enkripsi sisi server
# headers[OSS_SERVER_SIDE_ENCRYPTION] = SERVER_SIDE_ENCRYPTION_KMS
# Algoritma enkripsi (default: AES-256)
# headers[OSS_SERVER_SIDE_DATA_ENCRYPTION] = SERVER_SIDE_ENCRYPTION_KMS
# ID KMS Customer Master Key (CMK)
# headers[OSS_SERVER_SIDE_ENCRYPTION_KEY_ID] = '9468da86-3509-4f8d-a61e-6eab1eac****'
# Kelas penyimpanan
# headers['x-oss-storage-class'] = oss2.BUCKET_STORAGE_CLASS_STANDARD
# Tag objek
# headers[OSS_OBJECT_TAGGING] = 'k1=v1&k2=v2&k3=v3'

upload_id = bucket.init_multipart_upload(key, headers=headers).upload_id

Atur daftar kontrol akses (ACL) objek saat menyelesaikan unggahan:

headers = dict()
# Atur ACL objek menjadi private
# headers["x-oss-object-acl"] = oss2.OBJECT_ACL_PRIVATE
bucket.complete_multipart_upload(key, upload_id, parts, headers=headers)

Selesaikan unggahan dengan mencantumkan bagian di server

Alih-alih melacak bagian secara lokal, minta OSS untuk mencantumkan semua bagian yang telah diunggah dan merakitnya secara otomatis. Atur header x-oss-complete-all ke yes dan berikan parameter parts sebagai None.

Ketika x-oss-complete-all:yes ditentukan, badan permintaan tidak boleh disertakan. OSS akan mencantumkan semua bagian yang diunggah dengan ID unggah tertentu, mengurutkannya berdasarkan nomor bagian, lalu menyelesaikan unggahan.
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# Tentukan ID wilayah yang sesuai dengan titik akhir. Contoh: cn-hangzhou. Parameter ini wajib jika Anda menggunakan algoritma signature V4.
region = "cn-hangzhou"

# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampledir/exampleobject.txt.
key = 'exampledir/exampleobject.txt'

# Tentukan ID unggah. Anda bisa mendapatkan ID unggah dari respons operasi InitiateMultipartUpload.
upload_id = '0004B9894A22E5B1888A1E29F823****'

headers = dict()
# headers["x-oss-object-acl"] = oss2.OBJECT_ACL_PRIVATE
headers["x-oss-complete-all"] = 'yes'
bucket.complete_multipart_upload(key, upload_id, None, headers=headers)

Batalkan unggah multi-bagian

Panggil bucket.abort_multipart_upload() untuk membatalkan unggah multi-bagian yang sedang berlangsung. Setelah pembatalan, ID unggah menjadi tidak valid dan semua bagian yang telah diunggah akan dihapus.

# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# Tentukan ID wilayah yang sesuai dengan titik akhir. Contoh: cn-hangzhou. Parameter ini wajib jika Anda menggunakan algoritma signature V4.
region = "cn-hangzhou"

# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampledir/exampleobject.txt.
key = 'exampledir/exampleobject.txt'
# Tentukan ID unggah. Anda bisa mendapatkan ID unggah dari respons operasi InitiateMultipartUpload.
upload_id = 'yourUploadId'

# Batalkan tugas unggah multi-bagian dengan ID unggah tertentu. Bagian-bagian yang telah diunggah akan dihapus.
bucket.abort_multipart_upload(key, upload_id)

Cantumkan bagian yang telah diunggah

Gunakan oss2.PartIterator untuk mencantumkan semua bagian yang diunggah untuk ID unggah tertentu. Setiap bagian mencakup nomor bagian, ETag, dan ukurannya.

# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# Tentukan ID wilayah yang sesuai dengan titik akhir. Contoh: cn-hangzhou. Parameter ini wajib jika Anda menggunakan algoritma signature V4.
region = "cn-hangzhou"

# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampledir/exampleobject.txt.
key = 'exampledir/exampleobject.txt'
# Tentukan ID unggah. Anda bisa mendapatkan ID unggah dari respons operasi InitiateMultipartUpload. Anda harus mendapatkan ID unggah sebelum memanggil operasi CompleteMultipartUpload untuk menyelesaikan tugas unggah multi-bagian.
upload_id = 'yourUploadId'

# Cantumkan bagian-bagian yang telah diunggah menggunakan ID unggah tertentu.
for part_info in oss2.PartIterator(bucket, key, upload_id):
    print('part_number:', part_info.part_number)
    print('etag:', part_info.etag)
    print('size:', part_info.size)

Cantumkan tugas unggah multi-bagian

Cantumkan tugas untuk objek tertentu

Setiap pemanggilan init_multipart_upload() untuk objek yang sama menghasilkan ID unggah yang berbeda. Gunakan oss2.ObjectUploadIterator untuk mencantumkan semua tugas unggah multi-bagian aktif untuk suatu objek.

# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# Tentukan ID wilayah yang sesuai dengan titik akhir. Contoh: cn-hangzhou. Parameter ini wajib jika Anda menggunakan algoritma signature V4.
region = "cn-hangzhou"

# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampledir/exampleobject.txt.
key = 'exampledir/exampleobject.txt'

# Cantumkan semua tugas unggah multi-bagian objek tersebut.
for upload_info in oss2.ObjectUploadIterator(bucket, key):
    print('key:', upload_info.key)
    print('upload_id:', upload_info.upload_id)

Cantumkan semua tugas dalam bucket

Gunakan oss2.MultipartUploadIterator untuk mencantumkan semua tugas unggah multi-bagian aktif dalam sebuah bucket.

# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# Tentukan ID wilayah yang sesuai dengan titik akhir. Contoh: cn-hangzhou. Parameter ini wajib jika Anda menggunakan algoritma signature V4.
region = "cn-hangzhou"

# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# Cantumkan semua tugas unggah multi-bagian dalam bucket.
for upload_info in oss2.MultipartUploadIterator(bucket):
    print('key:', upload_info.key)
    print('upload_id:', upload_info.upload_id)

Cantumkan tugas berdasarkan awalan nama objek

Berikan parameter prefix untuk memfilter tugas unggah multi-bagian ke objek yang namanya diawali dengan awalan tertentu.

# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# Tentukan ID wilayah yang sesuai dengan titik akhir. Contoh: cn-hangzhou. Parameter ini wajib jika Anda menggunakan algoritma signature V4.
region = "cn-hangzhou"

# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)

# Cantumkan tugas unggah multi-bagian objek yang namanya mengandung awalan test dalam bucket.
for upload_info in oss2.MultipartUploadIterator(bucket, prefix='test'):
    print('key:', upload_info.key)
    print('upload_id:', upload_info.upload_id)

Bersihkan unggah multi-bagian yang belum selesai

Jika unggah multi-bagian terganggu dan AbortMultipartUpload tidak dipanggil, bagian-bagian yang telah diunggah tetap tersimpan di bucket dan menimbulkan biaya penyimpanan. Hapus bagian-bagian tersebut dengan salah satu metode berikut:

  • Hapus bagian secara manual — Lihat Hapus bagian.

  • Konfigurasikan aturan siklus hidup — Hapus bagian kedaluwarsa secara otomatis. Lihat Contoh konfigurasi.

Referensi

    Unggah multi-bagian melibatkan tiga operasi API:

    Operasi terkait: