日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

本文介紹如何將源Bucket中的文件(Object)復(fù)制到同一地域下相同或不同目標(biāo)Bucket中。

注意事項(xiàng)

  • 本文以華東1(杭州)外網(wǎng)Endpoint為例。如果您希望通過與OSS同地域的其他阿里云產(chǎn)品訪問OSS,請使用內(nèi)網(wǎng)Endpoint。關(guān)于OSS支持的Region與Endpoint的對應(yīng)關(guān)系,請參見訪問域名和數(shù)據(jù)中心

  • 本文以從環(huán)境變量讀取訪問憑證為例。如何配置訪問憑證,請參見配置訪問憑證

  • 本文以O(shè)SS域名新建OSSClient為例。如果您希望通過自定義域名、STS等方式新建OSSClient,請參見初始化

  • 拷貝文件時,您必須擁有源文件的讀權(quán)限及目標(biāo)Bucket的讀寫權(quán)限。

  • 拷貝文件時,您需要確保源Bucket和目標(biāo)Bucket均未設(shè)置合規(guī)保留策略,否則報錯The object you specified is immutable.

  • 不支持跨地域拷貝。例如不能將華東1(杭州)地域存儲空間中的文件拷貝到華北1(青島)地域。

拷貝小文件

對于小于1 GB的文件,您可以使用簡單拷貝。以下代碼用于通過簡單拷貝將源存儲空間srcexamplebucket中的srcexampleobject.txt文件拷貝到目標(biāo)存儲空間destexamplebucket中的destexampleobject.txt文件。

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

# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫源Bucket名稱,例如srcexamplebucket。
src_bucket_name = 'srcexamplebucket'
# 填寫與源Bucket處于同一地域的目標(biāo)Bucket名稱,例如destexamplebucket。
# 當(dāng)在同一個Bucket內(nèi)拷貝文件時,請確保源Bucket名稱和目標(biāo)Bucket名稱相同。
dest_bucket_name = 'destexamplebucket'
# yourEndpoint填寫B(tài)ucket所在Region對應(yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', dest_bucket_name)

# 填寫不包含Bucket名稱在內(nèi)源Object的完整路徑,例如srcexampleobject.txt。
src_object_name = 'srcexampleobject.txt'
# 填寫不包含Bucket名稱在內(nèi)目標(biāo)Object的完整路徑,例如destexampleobject.txt。
dest_object_name = 'destexampleobject.txt'

# headers = dict()
# 指定CopyObject操作時是否覆蓋同名目標(biāo)Object。此處設(shè)置為true,表示禁止覆蓋同名Object。
# headers['x-oss-forbid-overwrite'] = 'true'
# 指定拷貝的源地址。
# headers[OSS_COPY_OBJECT_SOURCE] = '/example-bucket-by-util/recode-test.txt'
# 如果源Object的ETag值和您提供的ETag相等,則執(zhí)行拷貝操作,并返回200 OK。
# headers['x-oss-copy-source-if-match'] = '5B3C1A2E053D763E1B002CC607C5****'
# 如果源Object的ETag值和您提供的ETag不相等,則執(zhí)行拷貝操作,并返回200 OK。
# headers['x-oss-copy-source-if-none-match'] = '5B3C1A2E053D763E1B002CC607C5****'
# 如果指定的時間等于或者晚于文件實(shí)際修改時間,則正常拷貝文件,并返回200 OK。
# headers['x-oss-copy-source-if-unmodified-since'] = '2021-12-09T07:01:56.000Z'
# 如果源Object在指定時間后被修改過,則執(zhí)行拷貝操作。
# headers['x-oss-copy-source-if-modified-since'] = '2021-12-09T07:01:56.000Z'
# 指定設(shè)置目標(biāo)Object元數(shù)據(jù)的方式。此處設(shè)置為COPY,表示復(fù)制源Object的元數(shù)據(jù)到目標(biāo)Object。
# headers[OSS_METADATA_DIRECTIVE] = 'COPY'
# 指定OSS創(chuàng)建目標(biāo)Object時使用的服務(wù)器端加密算法。
# headers[OSS_SERVER_SIDE_ENCRYPTION] = 'KMS'
# 表示KMS托管的用戶主密鑰,該參數(shù)僅在x-oss-server-side-encryption為KMS時有效。
# headers['x-oss-server-side-encryption-key-id'] = '9468da86-3509-4f8d-a61e-6eab1eac****'
# 指定OSS創(chuàng)建目標(biāo)Object時的訪問權(quán)限。此處設(shè)置為OBJECT_ACL_PRIVATE,表示只有Object的擁有者和授權(quán)用戶有該Object的讀寫權(quán)限,其他用戶沒有權(quán)限操作該Object。
# headers[OSS_OBJECT_ACL] = oss2.OBJECT_ACL_PRIVATE
# 指定Object的存儲類型。此處設(shè)置為BUCKET_STORAGE_CLASS_STANDARD,表示標(biāo)準(zhǔn)存儲類型。
# headers['x-oss-storage-class'] = oss2.BUCKET_STORAGE_CLASS_STANDARD
# 指定Object的對象標(biāo)簽,可同時設(shè)置多個標(biāo)簽。
# headers[OSS_OBJECT_TAGGING] = 'k1=v1&k2=v2&k3=v3'
# 指定設(shè)置目標(biāo)Object對象標(biāo)簽的方式。此處設(shè)置為COPY,表示復(fù)制源Object的對象標(biāo)簽到目標(biāo)Object。
# headers[OSS_OBJECT_TAGGING_COPY_DIRECTIVE] = 'COPY'
# result = bucket.copy_object(src_bucket_name, src_object_name, dest_object_name, headers=headers)

# 將源Bucket中的某個Object拷貝到目標(biāo)Bucket。
result = bucket.copy_object(src_bucket_name, src_object_name, dest_object_name)

# 查看返回結(jié)果的狀態(tài)。如果返回值為200,表示執(zhí)行成功。
print('result.status:', result.status)

拷貝大文件

對于大于1 GB的文件,需要使用分片拷貝(UploadPartCopy)。分片拷貝分為三步:

  1. 通過bucket.init_multipart_upload初始化分片拷貝任務(wù)。

  2. 通過bucket.upload_part_copy進(jìn)行分片拷貝。除最后一個分片外,其它分片都要大于100 KB。

  3. 通過bucket.complete_multipart_upload提交分片拷貝任務(wù)。

以下代碼用于通過分片拷貝將源存儲空間srcexamplebucket中的srcexampleobject.txt文件拷貝到目標(biāo)存儲空間destexamplebucket中的destexampleobject.txt文件。

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

# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫源Bucket名稱,例如srcexamplebucket。
src_bucket_name = 'srcexamplebucket'
# 填寫與源Bucket處于同一地域的目標(biāo)Bucket名稱,例如destexamplebucket。
# 當(dāng)在同一Bucket內(nèi)拷貝文件時,請確保源Bucket名稱和目標(biāo)Bucket名稱相同。
dest_bucket_name = 'destexamplebucket'
# yourEndpoint填寫B(tài)ucket所在Region對應(yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', dest_bucket_name)# 當(dāng)在同一Bucket內(nèi)拷貝文件時,請注釋掉該行代碼,并將后面的src_bucket改為bucket即可。
src_bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', src_bucket_name)

# 填寫不包含Bucket名稱在內(nèi)源Object的完整路徑,例如srcexampleobject.txt。
src_object_name = 'srcexampleobject.txt'
# 填寫不包含Bucket名稱在內(nèi)目標(biāo)Object的完整路徑,例如destexampleobject.txt。
dest_object_name = 'destexampleobject.txt'
# 獲取源文件的大小。當(dāng)在同一個Bucket內(nèi)拷貝文件時,請將src_bucket改為bucket。
head_info = src_bucket.head_object(src_object_name)
total_size = head_info.content_length
print('src object size:', total_size)

# determine_part_size方法用來確定分片大小。
part_size = determine_part_size(total_size, preferred_size=100 * 1024)
print('part_size:', part_size)

# 初始化分片。
upload_id = bucket.init_multipart_upload(dest_object_name).upload_id
parts = []

# 逐個上傳分片。
part_number = 1
offset = 0
while offset < total_size:
    num_to_upload = min(part_size, total_size - offset)
    end = offset + num_to_upload - 1
    # headers = dict()
    # 指定拷貝的源地址。    
    # headers[OSS_COPY_OBJECT_SOURCE] = '/example-bucket-by-util/recode-test.txt'
    # 指定源Object的拷貝范圍。例如設(shè)置bytes=0~1023,表示拷貝1~1024字節(jié)的內(nèi)容。
    # headers[OSS_COPY_OBJECT_SOURCE_RANGE] = 'bytes=0~1023'
    # 如果源Object的ETag值和您提供的ETag相等,則執(zhí)行拷貝操作,并返回200 OK。
    # headers['x-oss-copy-source-if-match'] = '5B3C1A2E053D763E1B002CC6****'
    # 如果源Object的ETag值和您提供的ETag不相等,則執(zhí)行拷貝操作,并返回200 OK。
    # headers['x-oss-copy-source-if-none-match'] = '5B3C1A2E053D763E1B002CC6****'
    # 如果指定的時間等于或者晚于文件實(shí)際修改時間,則正常拷貝文件,并返回200 OK。
    # headers['x-oss-copy-source-if-unmodified-since'] = '2021-12-09T07:01:56.000Z'
    # 如果指定的時間早于文件實(shí)際修改時間,則正常拷貝文件,并返回200 OK。
    # headers['x-oss-copy-source-if-modified-since'] = '2021-12-09T07:01:56.000Z'  
    # result = bucket.upload_part_copy(src_bucket_name, src_object_name, (offset, end), dest_object_name, upload_id, part_number, headers=headers)
    
    result = bucket.upload_part_copy(src_bucket_name, src_object_name, (offset, end), dest_object_name, upload_id, part_number)
    # 保存part信息。
    parts.append(PartInfo(part_number, result.etag))

    offset += num_to_upload
    part_number += 1

# 完成分片拷貝。
result = bucket.complete_multipart_upload(dest_object_name, upload_id, parts)
# 查看拷貝返回狀態(tài)。
print('result :', result.status)
# 獲取文件元數(shù)據(jù)。
head_info = bucket.head_object(dest_object_name)
# 查看目標(biāo)Object大小。
dest_object_size = head_info.content_length
print('dest object size:', dest_object_size)
# 對比源Object和目標(biāo)Object的大小。
assert dest_object_size == total_size

相關(guān)文檔

  • 拷貝小文件

    • 關(guān)于拷貝小文件的完整示例代碼,請參見GitHub示例

    • 關(guān)于拷貝小文件的API接口說明,請參見CopyObject

  • 拷貝大文件

    關(guān)于拷貝大文件的API接口說明,請參見UploadPartCopy