Topik ini menjelaskan cara menggunakan unduhan rentang untuk mengunduh secara efisien rentang data tertentu dari sebuah objek.
Catatan penggunaan
Kode contoh dalam topik ini menggunakan ID Wilayah
cn-hangzhouuntuk Wilayah Hangzhou, Tiongkok. Secara default, titik akhir publik digunakan untuk mengakses sumber daya dalam bucket. Jika Anda ingin mengakses sumber daya di bucket dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir yang didukung oleh OSS, lihat Wilayah dan Titik Akhir OSS.Untuk menggunakan unduhan rentang, Anda harus memiliki izin
oss:GetObject. Untuk informasi lebih lanjut, lihat Memberikan Kebijakan Kustom kepada Pengguna RAM.
Definisi metode
get_object(request: GetObjectRequest, **kwargs) → GetObjectResultParameter permintaan
Parameter | Tipe | Deskripsi |
request | *GetObjectRequest | Tetapkan parameter permintaan untuk antarmuka spesifik, seperti menetapkan range_header untuk menentukan rentang unduhan, dan menetapkan range_behavior untuk menentukan perilaku standar untuk unduhan rentang. Untuk informasi lebih lanjut, lihat GetObjectRequest |
Parameter tanggapan
Tipe | Deskripsi |
GetObjectResult | Respons terhadap operasi. Parameter ini tersedia ketika nilai err adalah nil. Untuk informasi lebih lanjut, lihat GetObjectResult |
Untuk objek berukuran 1.000 byte, rentang valid adalah dari byte 0 hingga byte 999. Jika rentang yang ditentukan berada di luar 0 hingga 999, rentang tersebut tidak berlaku. Dalam hal ini, OSS mengembalikan kode status HTTP 200 dan seluruh objek. Contoh berikut menunjukkan permintaan tidak valid dan hasil yang dikembalikan:
Jika Anda menetapkan Range: bytes menjadi 500-2000, akhir rentang tidak valid. Dalam hal ini, OSS mengembalikan kode status HTTP 200 dan seluruh objek.
Jika Anda menetapkan Range: bytes menjadi 1000-2000, awal rentang tidak valid. Dalam hal ini, OSS mengembalikan kode status HTTP 200 dan seluruh objek.
Anda dapat menambahkan header x-oss-range-behavior:standard ke permintaan untuk memodifikasi perilaku unduhan ketika rentang yang ditentukan tidak valid. Untuk objek berukuran 1.000 byte:
Jika Anda menetapkan Range: bytes menjadi 500-2000, akhir rentang tidak valid. Dalam hal ini, OSS mengembalikan kode status HTTP 206 dan data dari byte 500 hingga byte 999.
Jika Anda menetapkan Range: bytes menjadi 1000-2000, awal rentang tidak valid. Dalam hal ini, OSS mengembalikan kode status HTTP 416 dan kode kesalahan InvalidRange.
Kode contoh
Kode berikut menunjukkan cara menambahkan header permintaan RangeBehavior:standard ke permintaan. Header ini menentukan perilaku unduhan standar, yang mengunduh data file dalam rentang tertentu.
import argparse
import alibabacloud_oss_v2 as oss
# Buat parser parameter baris perintah.
parser = argparse.ArgumentParser(description="Contoh mendapatkan rentang objek")
# Tambahkan parameter baris perintah yang diperlukan.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
parser.add_argument('--bucket', help='Nama bucket.', required=True)
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
parser.add_argument('--key', help='Nama objek.', required=True)
parser.add_argument('--range', help='Tentukan ruang lingkup transfer file. Contoh nilai: bytes=0-9', required=True)
parser.add_argument('--range_behavior', help='Standar untuk perilaku unduhan dalam rentang tertentu. Contoh nilai: standard.')
def main():
# Parse parameter baris perintah.
args = parser.parse_args()
# Muat kredensial akses dari variabel lingkungan.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Gunakan konfigurasi default dari SDK.
cfg = oss.config.load_default()
# Tentukan penyedia kredensial.
cfg.credentials_provider = credentials_provider
# Tentukan wilayah.
cfg.region = args.region
# Jika endpoint disediakan dari baris perintah, perbarui endpoint dalam konfigurasi dengan endpoint yang diberikan.
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# Buat klien OSS.
client = oss.Client(cfg)
# Mulai permintaan untuk mendapatkan objek.
result = client.get_object(oss.GetObjectRequest(
bucket=args.bucket, # Tentukan nama bucket
key=args.key, # Tentukan nama kunci objek
range_header=args.range, # Tentukan header rentang
range_behavior=args.range_behavior, # Tentukan perilaku unduhan dalam rentang
))
# Cetak beberapa atribut dalam tanggapan.
print(f'kode status: {result.status_code},'
f' ID permintaan: {result.request_id},'
f' panjang konten: {result.content_length},'
f' rentang konten: {result.content_range},'
f' tipe konten: {result.content_type},'
f' etag: {result.etag},'
f' terakhir dimodifikasi: {result.last_modified},'
f' md5 konten: {result.content_md5},'
f' kontrol cache: {result.cache_control},'
f' disposisi konten: {result.content_disposition},'
f' enkode konten: {result.content_encoding},'
f' kedaluwarsa: {result.expires},'
f' hash crc64: {result.hash_crc64},'
f' kelas penyimpanan: {result.storage_class},'
f' tipe objek: {result.object_type},'
f' ID versi: {result.version_id},'
f' jumlah tag: {result.tagging_count},'
f' enkripsi sisi server: {result.server_side_encryption},'
f' enkripsi data sisi server: {result.server_side_data_encryption},'
f' posisi tambahan berikutnya: {result.next_append_position},'
f' kedaluwarsa: {result.expiration},'
f' pemulihan: {result.restore},'
f' status proses: {result.process_status},'
f' penanda hapus: {result.delete_marker},'
)
# ========== Metode 1: Baca sepenuhnya ==========
# Gunakan manajer konteks untuk memastikan pelepasan sumber daya.
with result.body as body_stream:
data = body_stream.read()
print(f"Baca file selesai, panjang data: {len(data)} byte")
path = "./get-object-sample.txt"
with open(path, 'wb') as f:
f.write(data)
print(f"Unduhan file selesai, disimpan di path: {path}")
# # ========== Metode 2: Baca dalam blok ==========
# # Gunakan manajer konteks untuk memastikan pelepasan sumber daya.
# with result.body as body_stream:
# chunk_path = "./get-object-sample-chunks.txt"
# total_size = 0
# with open(chunk_path, 'wb') as f:
# # Gunakan ukuran blok 256 KB (sesuaikan parameter block_size sesuai kebutuhan).
# for chunk in body_stream.iter_bytes(block_size=256 * 1024):
# f.write(chunk)
# total_size += len(chunk)
# print(f"Menerima blok data: {len(chunk)} byte | Total: {total_size} byte")
# print(f"Unduhan file selesai, disimpan di path: {chunk_path}")
# Panggil fungsi utama saat skrip dijalankan sebagai program utama.
if __name__ == "__main__":
main()
Referensi
Untuk kode contoh lengkap untuk unduhan rentang, lihat get_object_range.py.