Secara default, jika Anda mengunggah objek dengan nama yang sama dengan objek yang sudah ada, objek lama akan ditimpa oleh objek baru. Topik ini menjelaskan cara mengonfigurasi header permintaan x-oss-forbid-overwrite untuk mencegah penimpaan objek saat melakukan unggah sederhana, unggah multi-bagian, atau penyalinan objek.
Catatan penggunaan
Dalam topik ini, titik akhir publik Wilayah China (Hangzhou) digunakan. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang Wilayah dan titik akhir OSS, lihat Wilayah dan Titik Akhir OSS.
Dalam topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi lebih lanjut tentang konfigurasi kredensial akses, lihat Mengonfigurasi Kredensial Akses Menggunakan OSS SDK untuk Python 1.0.
Dalam topik ini, instans OSSClient dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Layanan Token Keamanan (STS), lihat Inisialisasi.
Mencegah penimpaan dalam tugas unggah sederhana
Berikut adalah contoh kode yang menunjukkan cara mencegah penimpaan objek saat melakukan unggah sederhana:
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, 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 ke 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 diperlukan jika Anda menggunakan algoritma tanda tangan V4.
region = "cn-hangzhou"
# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# Unggah objek.
# Tentukan apakah objek yang diunggah dengan memanggil operasi PutObject menimpa objek yang sudah ada dengan nama yang sama.
# Secara default, jika x-oss-forbid-overwrite tidak ditentukan, objek yang diunggah akan menimpa objek yang sudah ada dengan nama yang sama.
# Jika x-oss-forbid-overwrite disetel ke false, objek yang diunggah akan menimpa objek yang sudah ada dengan nama yang sama.
# Jika x-oss-forbid-overwrite disetel ke true, objek yang diunggah tidak dapat menimpa objek yang sudah ada dengan nama yang sama. Jika objek dengan nama yang sama ada di bucket, OSS akan mengembalikan kesalahan.
headers = {'x-oss-forbid-overwrite': 'true'}
result = bucket.put_object('yourObjectName', 'konten objek', headers=headers)
# Tampilkan kode status HTTP yang dikembalikan.
print('http status: {0}'.format(result.status))
# Tampilkan ID permintaan. ID permintaan secara unik mengidentifikasi permintaan. Kami sarankan Anda menambahkan parameter ini ke log.
print('request_id: {0}'.format(result.request_id))
# Tampilkan nilai ETag yang dikembalikan oleh metode put_object.
print('ETag: {0}'.format(result.etag))
# Tampilkan header respons HTTP.
print('date: {0}'.format(result.headers['date']))Mencegah penimpaan dalam tugas penyalinan objek
Menyalin Objek Kecil
Berikut adalah contoh kode yang menunjukkan cara menyalin objek kecil tanpa menimpa objek yang sudah ada:
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. # Tentukan nama bucket Anda. bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName') # Tentukan apakah objek yang disalin dengan memanggil operasi copy_object menimpa objek yang sudah ada dengan nama yang sama. # Secara default, jika x-oss-forbid-overwrite tidak ditentukan, objek yang sudah ada akan ditimpa oleh objek yang disalin dengan nama yang sama. # Jika x-oss-forbid-overwrite disetel ke false, objek yang sudah ada akan ditimpa oleh objek yang disalin dengan nama yang sama. # Jika x-oss-forbid-overwrite disetel ke true, objek yang sudah ada tidak akan ditimpa oleh objek yang disalin dengan nama yang sama. Jika objek yang sudah ada memiliki nama yang sama dengan objek yang disalin, kesalahan akan dilaporkan. headers = dict() headers = {'x-oss-forbid-overwrite':'true'} bucket.copy_object('yourSourceBucketName', 'yourSourceObjectName', 'yourDestinationObjectName', headers=headers)Menyalin Objek Besar
Berikut adalah contoh kode yang menunjukkan cara mencegah penimpaan objek besar saat menggunakan salinan multi-bagian:
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider from oss2.models import PartInfo from oss2 import determine_part_size # Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, 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 ke 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 diperlukan jika Anda menggunakan algoritma tanda tangan V4. region = "cn-hangzhou" # Tentukan nama bucket Anda. bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region) src_object = 'yourSourceObjectName' dst_object = 'yourDestinationObjectName' total_size = bucket.head_object(src_object).content_length part_size = determine_part_size(total_size, preferred_size=100 * 1024) # Mulai tugas unggah multi-bagian. # Tentukan apakah akan menimpa objek dengan nama yang sama saat Anda menyalin objek. # Secara default, jika x-oss-forbid-overwrite tidak ditentukan, objek yang disalin akan menimpa objek yang sudah ada dengan nama yang sama. # Jika x-oss-forbid-overwrite disetel ke false, objek yang disalin akan menimpa objek yang sudah ada dengan nama yang sama. # Jika x-oss-forbid-overwrite disetel ke true, objek yang sudah ada tidak akan ditimpa oleh objek yang disalin dengan nama yang sama. Jika objek yang sudah ada memiliki nama yang sama dengan objek yang disalin, kesalahan akan dilaporkan. headers = dict() headers = {'x-oss-forbid-overwrite': 'true'} upload_id = bucket.init_multipart_upload(dst_object, headers=headers).upload_id parts = [] # Salin setiap bagian. part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) byte_range = (offset, offset + num_to_upload - 1) result = bucket.upload_part_copy(bucket.bucket_name, src_object, byte_range,dst_object, upload_id, part_number) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1 # Selesaikan tugas salinan multi-bagian. # Tentukan apakah akan menimpa objek dengan nama yang sama saat Anda menyalin objek. # Secara default, jika x-oss-forbid-overwrite tidak ditentukan, objek yang diunggah akan menimpa objek yang sudah ada dengan nama yang sama. # Jika x-oss-forbid-overwrite disetel ke false, objek yang diunggah akan menimpa objek yang sudah ada dengan nama yang sama. # Jika x-oss-forbid-overwrite disetel ke true, objek yang sudah ada tidak akan ditimpa oleh objek yang disalin dengan nama yang sama. Jika objek yang sudah ada memiliki nama yang sama dengan objek yang disalin, kesalahan akan dilaporkan. headers = dict() headers = {'x-oss-forbid-overwrite':'true'} bucket.complete_multipart_upload(dst_object, upload_id, parts, headers=headers)
Mencegah penimpaan dalam tugas unggah multi-bagian
Berikut adalah contoh kode yang menunjukkan cara mencegah penimpaan objek saat menggunakan unggah multi-bagian:
# -*- 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 sampel, 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 ke 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 diperlukan jika Anda menggunakan algoritma tanda tangan V4.
region = "cn-hangzhou"
# Tentukan nama bucket Anda.
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
key = 'yourObjectName'
filename = 'yourLocalFile'
total_size = os.path.getsize(filename)
# Tentukan metode determine_part_size untuk menentukan ukuran bagian.
part_size = determine_part_size(total_size, preferred_size=100 * 1024)
# Mulai tugas unggah multi-bagian.
# Tentukan apakah akan menimpa objek yang sudah ada dengan nama yang sama saat Anda melakukan unggah multi-bagian.
# Secara default, jika x-oss-forbid-overwrite tidak ditentukan, objek yang diunggah akan menimpa objek yang sudah ada dengan nama yang sama.
# Jika x-oss-forbid-overwrite disetel ke false, objek yang diunggah akan menimpa objek yang sudah ada dengan nama yang sama.
# Jika x-oss-forbid-overwrite disetel ke true, objek yang diunggah tidak dapat menimpa objek yang sudah ada dengan nama yang sama. Jika objek dengan nama yang sama ada di bucket, OSS akan mengembalikan kesalahan.
headers = {'x-oss-forbid-overwrite': 'true'}
upload_id = bucket.init_multipart_upload(key, headers=headers).upload_id
parts = []
# Unggah bagian-bagian.
with open(filename, 'rb') as fileobj:
part_number = 1
offset = 0
while offset < total_size:
num_to_upload = min(part_size, total_size - offset)
# Metode SizedFileAdapter(fileobj, size) menghasilkan objek baru dan menghitung ulang posisi dari mana operasi tambahan dimulai.
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.
# Tentukan apakah akan menimpa objek yang sudah ada dengan nama yang sama saat Anda melakukan unggah multi-bagian.
# Secara default, jika x-oss-forbid-overwrite tidak ditentukan, objek yang diunggah akan menimpa objek yang sudah ada dengan nama yang sama.
# Jika x-oss-forbid-overwrite disetel ke false, objek yang diunggah akan menimpa objek yang sudah ada dengan nama yang sama.
# Jika x-oss-forbid-overwrite disetel ke true, objek yang diunggah tidak dapat menimpa objek yang sudah ada dengan nama yang sama. Jika objek dengan nama yang sama ada di bucket, OSS akan mengembalikan kesalahan.
headers = {'x-oss-forbid-overwrite': 'true'}
bucket.complete_multipart_upload(key, upload_id, parts, headers=headers)
# Verifikasi hasil tugas unggah multi-bagian.
with open(filename, 'rb') as fileobj:
assert bucket.get_object(key).read() == fileobj.read()Referensi
Untuk informasi lebih lanjut tentang operasi API untuk unggah sederhana, lihat PutObject.
Untuk informasi lebih lanjut tentang operasi API untuk penyalinan objek, lihat CopyObject.
Untuk informasi lebih lanjut tentang operasi API untuk unggah multi-bagian, lihat InitiateMultipartUpload dan CompleteMultipartUpload.