全部产品
Search
文档中心

Object Storage Service:Unggah tambahan (Python SDK V2)

更新时间:Nov 09, 2025

Unggah tambah memungkinkan Anda menambahkan data ke akhir objek tambah yang sudah ada. Topik ini menjelaskan cara melakukan unggah tambah menggunakan OSS SDK untuk Python V2.

Peringatan

  • Kode contoh dalam topik ini menggunakan Wilayah China (Hangzhou), dengan ID wilayah cn-hangzhou, sebagai contoh. Secara default, titik akhir publik digunakan. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama dengan OSS, Anda harus menggunakan titik akhir internal. Untuk informasi lebih lanjut tentang pemetaan antara wilayah OSS dan titik akhir, lihat Wilayah dan Titik Akhir OSS.

  • Jika objek tidak ada, memanggil metode unggah tambah akan membuat objek tambah.

  • Jika objek ada:

    • Jika objek adalah objek tambah dan posisi tambah yang ditentukan sama dengan panjang saat ini dari objek, konten akan ditambahkan ke akhir objek.

    • Jika objek adalah objek tambah tetapi posisi tambah yang ditentukan tidak sama dengan panjang saat ini dari objek, pengecualian PositionNotEqualToLength akan dilemparkan.

    • Jika objek bukan objek tambah, seperti objek normal yang diunggah menggunakan unggah sederhana, pengecualian ObjectNotAppendable akan dilemparkan.

Izin

Secara default, Akun Alibaba Cloud memiliki izin penuh. Pengguna RAM atau Peran RAM di bawah Akun Alibaba Cloud tidak memiliki izin apa pun secara default. Akun Alibaba Cloud atau administrator akun harus memberikan izin operasi melalui Kebijakan RAM atau Kebijakan Bucket.

API

Aksi

Definisi

AppendObject

oss:PutObject

Anda dapat memanggil operasi ini untuk mengunggah objek dengan menambahkan objek ke objek yang sudah ada.

oss:PutObjectTagging

Saat mengunggah objek dengan menambahkan objek ke objek yang sudah ada, jika Anda menentukan tag objek melalui x-oss-tagging, izin ini diperlukan.

Definisi metode

Untuk skenario unggah tambah, Python SDK V2 menambahkan metode AppendFile untuk mensimulasikan operasi baca dan tulis file pada objek dalam bucket. Tabel berikut menjelaskan metode AppendFile dan AppendObject.

Metode

Deskripsi

AppendFile

Menyediakan fitur yang sama dengan metode AppendObject.

Mengoptimalkan toleransi kesalahan untuk pengiriman ulang setelah kegagalan.

AppendObject

Memperluas unggah tambahan. Objek akhir bisa mencapai ukuran maksimum 5 GiB.

Mendukung validasi data CRC-64 (diaktifkan secara default).

Mendukung grafik bilah kemajuan.

AppendFile: API unggah tambahan Edisi Premium

Anda dapat memanggil metode AppendFile untuk mengunggah data dalam mode tambah. Jika objek tidak ada, objek tambah dibuat. Jika objek ada tetapi bukan objek tambah, kesalahan akan dikembalikan.

Kode berikut menunjukkan definisi metode AppendFile.

append_file(bucket: str, key: str, request_payer: str | None = None, create_parameter: AppendObjectRequest | None = None, **kwargs) → AppendOnlyFile

Parameter permintaan

Parameter

Tipe

Deskripsi

bucket

str

Nama bucket.

key

str

Nama objek.

RequestPayer

str

Jika mode bayar-per-permintaan diaktifkan, atur parameter ini ke 'requester'.

CreateParameter

AppendObjectRequest

Metadata objek yang disetel untuk unggah pertama, termasuk ContentType, Metadata, izin, dan kelas penyimpanan. Untuk informasi lebih lanjut, lihat AppendObjectRequest.

Nilai kembali

Tipe

Deskripsi

AppendOnlyFile

Instans file tambahan. Untuk informasi lebih lanjut, lihat AppendOnlyFile.

Tabel berikut menjelaskan metode yang termasuk dalam kelas AppendOnlyFile.

Metode

Deskripsi

Close()

Menutup handle file dan melepaskan sumber daya.

write(b)

Menulis data byte ke file dan mengembalikan jumlah byte yang ditulis.

write_from(b: str | bytes | Iterable[bytes] | IO[str] | IO[bytes])

Menulis data apa pun ke file dan mengembalikan jumlah byte yang ditulis.

Untuk definisi lengkap metode AppendFile, lihat append_file.

AppendObject: API unggah tambahan Edisi Dasar

append_object(request: AppendObjectRequest, **kwargs) → AppendObjectResult

Parameter permintaan

Parameter

Tipe

Deskripsi

request

AppendObjectRequest

Parameter permintaan. Untuk informasi lebih lanjut, lihat AppendObjectRequest.

Nilai kembali

Tipe

Deskripsi

AppendObjectResult

Nilai kembali. Untuk informasi lebih lanjut, lihat AppendObjectResult.

Untuk definisi lengkap metode AppendObject, lihat append_object.

Contoh

(Direkomendasikan) Gunakan AppendFile untuk melakukan unggah tambahan

import argparse
import alibabacloud_oss_v2 as oss

# Buat parser argumen baris perintah dan jelaskan tujuan dari skrip: Contoh ini menunjukkan cara menambahkan data ke objek OSS.
parser = argparse.ArgumentParser(description="contoh unggah file tambahan")

# Tambahkan argumen baris perintah --region, yang menentukan wilayah tempat bucket berada. Argumen ini wajib.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tambahkan argumen baris perintah --bucket, yang menentukan nama bucket yang akan dioperasikan. Argumen ini wajib.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Tambahkan argumen baris perintah --endpoint, yang menentukan nama domain yang dapat digunakan layanan lain untuk mengakses OSS. Argumen ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Tambahkan argumen baris perintah --key, yang menentukan kunci objek (file) di OSS. Argumen ini wajib.
parser.add_argument('--key', help='Nama objek.', required=True)

def main():
    # Parsing argumen baris perintah untuk mendapatkan nilai yang diberikan 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()

    # Buat objek konfigurasi menggunakan konfigurasi default dari SDK dan atur penyedia kredensial.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    cfg.region = args.region

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

    # Inisialisasi klien OSS dengan konfigurasi sebelumnya untuk mempersiapkan interaksi dengan OSS.
    client = oss.Client(cfg)

    # Tentukan data yang akan ditambahkan.
    data1 = b'hello'
    data2 = b' world. '

    # Tambahkan data untuk pertama kalinya.
    with client.append_file(bucket=args.bucket, key=args.key) as f:
        append_f = f
        f.write(data1)
    # Cetak status file setelah operasi tambahan pertama.
    print(f'tertutup: {append_f.closed},'
          f' nama: {append_f.name}'
    )

    # Tambahkan data untuk kedua kalinya.
    with client.append_file(bucket=args.bucket, key=args.key) as f:
        append_f = f
        f.write(data2)
    # Cetak status file setelah operasi tambahan kedua.
    print(f'tertutup: {append_f.closed},'
          f' nama: {append_f.name}'
    )

    # Dapatkan isi objek setelah menambahkan data.
    result = client.get_object(oss.GetObjectRequest(
        bucket=args.bucket,
        key=args.key,
    ))
    # Cetak hasil mendapatkan objek.
    print(f'kode status: {result.status_code},'
          f' id permintaan: {result.request_id},'
          f' konten: {result.body.content.decode("utf-8")}'
    )

# Saat skrip ini dieksekusi langsung, panggil fungsi utama untuk memulai logika pemrosesan.
if __name__ == "__main__":
    main()  # Titik masuk skrip, di mana alur program dimulai.

Gunakan AppendObject untuk melakukan unggah tambahan

import argparse
import alibabacloud_oss_v2 as oss

# Buat parser argumen baris perintah.
parser = argparse.ArgumentParser(description="contoh objek tambahan")

# Tambahkan argumen baris perintah.
# --region: Menentukan wilayah tempat bucket OSS berada.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# --bucket: Menentukan nama bucket yang akan dioperasikan.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# --endpoint: Parameter opsional yang menentukan nama domain yang digunakan untuk mengakses layanan OSS.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# --key: Menentukan kunci objek (file) di OSS.
parser.add_argument('--key', help='Nama objek.', required=True)

def main():
    # Parsing argumen baris perintah.
    args = parser.parse_args()

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

    # Buat objek konfigurasi menggunakan konfigurasi default yang disediakan oleh SDK.
    cfg = oss.config.load_default()

    # Atur penyedia kredensial ke objek yang sebelumnya dibuat.
    cfg.credentials_provider = credentials_provider

    # Atur wilayah untuk klien OSS berdasarkan input pengguna.
    cfg.region = args.region

    # Jika pengguna memberikan titik akhir kustom, perbarui konfigurasi.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Buat instans klien OSS menggunakan konfigurasi sebelumnya.
    client = oss.Client(cfg)

    # Tentukan data yang akan ditambahkan.
    data1 = b'hello'
    data2 = b' world'

    # Tambahkan data untuk pertama kalinya.
    result = client.append_object(oss.AppendObjectRequest(
        bucket=args.bucket,  # Tentukan bucket tujuan.
        key=args.key,  # Tentukan kunci objek.
        position=0,  # Posisi awal untuk menambahkan, yang awalnya 0.
        body=data1,  # Data yang akan ditambahkan.
    ))

    # Cetak hasil operasi tambahan pertama.
    print(f'kode status: {result.status_code},'
          f' id permintaan: {result.request_id},'
          f' id versi: {result.version_id},'
          f' hash crc64: {result.hash_crc64},'
          f' posisi berikutnya: {result.next_position},' 
    )

    # Tambahkan data untuk kedua kalinya.
    result = client.append_object(oss.AppendObjectRequest(
        bucket=args.bucket,  # Tentukan bucket tujuan.
        key=args.key,  # Tentukan kunci objek.
        position=result.next_position,  # Mulai dari posisi berikutnya dari operasi tambahan sebelumnya.
        body=data2,  # Data yang akan ditambahkan.
    ))

    # Cetak hasil operasi tambahan kedua.
    print(f'kode status: {result.status_code},'
          f' id permintaan: {result.request_id},'
          f' id versi: {result.version_id},'
          f' hash crc64: {result.hash_crc64},'
          f' posisi berikutnya: {result.next_position},'
    )

# Saat skrip ini dijalankan langsung, panggil fungsi utama.
if __name__ == "__main__":
    main()

Skenario

Tampilkan bilah kemajuan untuk unggah tambahan

import argparse
import alibabacloud_oss_v2 as oss

# Buat parser argumen baris perintah.
parser = argparse.ArgumentParser(description="contoh objek tambahan")

# Tambahkan argumen baris perintah.
# --region: Menentukan wilayah tempat bucket OSS berada.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# --bucket: Menentukan nama bucket yang akan dioperasikan.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# --endpoint: Parameter opsional yang menentukan nama domain yang digunakan untuk mengakses layanan OSS.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# --key: Menentukan kunci objek (file) di OSS.
parser.add_argument('--key', help='Nama objek.', required=True)

def main():
    # Parsing argumen baris perintah.
    args = parser.parse_args()

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

    # Buat objek konfigurasi menggunakan konfigurasi default yang disediakan oleh SDK.
    cfg = oss.config.load_default()

    # Atur penyedia kredensial ke objek yang sebelumnya dibuat.
    cfg.credentials_provider = credentials_provider

    # Atur wilayah untuk klien OSS berdasarkan input pengguna.
    cfg.region = args.region

    # Jika pengguna memberikan titik akhir kustom, perbarui konfigurasi.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Buat instans klien OSS menggunakan konfigurasi sebelumnya.
    client = oss.Client(cfg)

    # Tentukan variabel kamus bernama progress_state untuk menyimpan status kemajuan unggah. Nilai awal adalah 0.
    progress_state = {'saved': 0}
    def _progress_fn(n, written, total):
        # Gunakan kamus untuk menyimpan jumlah byte tertulis kumulatif untuk menghindari penggunaan variabel global.
        progress_state['saved'] += n

        # Hitung persentase unggah saat ini. Nilainya diperoleh dengan membagi jumlah byte tertulis dengan jumlah total byte dan membulatkan hasilnya ke bawah.
        rate = int(100 * (float(written) / float(total)))

        # Cetak kemajuan unggah saat ini. \r menunjukkan kembali ke awal baris untuk mengimplementasikan refresh real-time di baris perintah.
        # end='' menunjukkan tidak ada baris baru, sehingga cetakan berikutnya menimpa baris saat ini.
        print(f'\rKemajuan unggah: {rate}% ', end='')

    # Tentukan data yang akan ditambahkan.
    data1 = b'hello'
    data2 = b' world'

    # Tambahkan data untuk pertama kalinya.
    result = client.append_object(oss.AppendObjectRequest(
        bucket=args.bucket,  # Tentukan bucket tujuan.
        key=args.key,  # Tentukan kunci objek.
        position=0,  # Posisi awal untuk menambahkan, yang awalnya 0.
        body=data1,  # Data yang akan ditambahkan.
        progress_fn=_progress_fn,  # Tetapkan fungsi callback kemajuan.
    ))

    # Cetak hasil operasi tambahan pertama.
    print(f'kode status: {result.status_code},'
          f' id permintaan: {result.request_id},'
          f' id versi: {result.version_id},'
          f' hash crc64: {result.hash_crc64},'
          f' posisi berikutnya: {result.next_position},'
    )

    # Tambahkan data untuk kedua kalinya.
    result = client.append_object(oss.AppendObjectRequest(
        bucket=args.bucket,  # Tentukan bucket tujuan.
        key=args.key,  # Tentukan kunci objek.
        position=result.next_position,  # Mulai dari posisi berikutnya dari operasi tambahan sebelumnya.
        body=data2,  # Data yang akan ditambahkan.
        progress_fn=_progress_fn,  # Tetapkan fungsi callback kemajuan.
    ))

    # Cetak hasil operasi tambahan kedua.
    print(f'kode status: {result.status_code},'
          f' id permintaan: {result.request_id},'
          f' id versi: {result.version_id},'
          f' hash crc64: {result.hash_crc64},'
          f' posisi berikutnya: {result.next_position},'
    )

# Saat skrip ini dijalankan langsung, panggil fungsi utama.
if __name__ == "__main__":
    main()

Referensi