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

本文介紹如何在受版本控制的存儲(chǔ)空間(Bucket)中拷貝文件(Object)。您可以通過CopyObject的方法拷貝小于1 GB的文件,通過分片拷貝(UploadPartCopy)的方法拷貝大于1 GB的文件。

注意事項(xiàng)

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

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

  • 要拷貝文件,您必須有oss:GetObjectoss:PutObject權(quán)限。具體操作,請(qǐng)參見為RAM用戶授權(quán)自定義的權(quán)限策略

拷貝小文件

對(duì)于小于1 GB的文件,您可以通過CopyObject方法將文件從一個(gè)存儲(chǔ)空間(源存儲(chǔ)空間)復(fù)制到同一地域的另一個(gè)存儲(chǔ)空間(目標(biāo)存儲(chǔ)空間)。

  • x-oss-copy-source默認(rèn)拷貝Object的當(dāng)前版本。如果當(dāng)前版本是刪除標(biāo)記,則返回404表示該Object不存在。您可以在x-oss-copy-source中加入versionId來拷貝指定的Object版本,刪除標(biāo)記不能被拷貝。

  • 您可以將Object的早期版本拷貝到同一個(gè)Bucket中,拷貝Object的歷史版本將會(huì)成為一個(gè)新的當(dāng)前版本,達(dá)到恢復(fù)Object早期版本的目的。

  • 如果目標(biāo)Bucket已開啟版本控制,OSS將會(huì)為新拷貝出來的Object自動(dòng)生成唯一的版本ID,此版本ID將會(huì)在響應(yīng)header的x-oss-version-id中返回。如果目標(biāo)Bucket未開啟或者暫停了版本控制,OSS將會(huì)為新拷貝的Object自動(dòng)生成version ID為“null”的版本,且會(huì)覆蓋原先versionId為“null”的版本。

  • 當(dāng)目標(biāo)Bucket未開啟版本控制時(shí),支持對(duì)Appendable類型Object執(zhí)行拷貝操作;當(dāng)目標(biāo)Bucket開啟或暫停版本控制狀態(tài)時(shí),不支持對(duì)Appendable類型Object執(zhí)行拷貝操作。

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

# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(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)拷貝文件時(shí),請(qǐng)確保源Bucket名稱和目標(biāo)Bucket名稱相同。
dest_bucket_name = 'destexamplebucket'
# yourEndpoint填寫B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', dest_bucket_name)

# 填寫源Object完整路徑,完整路徑中不能包含Bucket名稱,例如srcexampledir/exampleobject.txt。
src_object_name = 'srcexampledir/exampleobject.txt'
# 填寫目標(biāo)Object完整路徑,完整路徑中不能包含Bucket名稱,例如destexampledir/exampleobject.txt。
dest_object_name = 'destexampledir/exampleobject.txt'
# 填寫Object的版本ID。
versionId = 'CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****'

# 拷貝指定版本的文件。
params = dict()
params['versionId'] = versionId

# 從源Bucket中拷貝一個(gè)Object到目標(biāo)Bucket。
result = bucket.copy_object(src_bucket_name, src_object_name, dest_object_name, params=params)
# 查看返回結(jié)果的狀態(tài),如果返回值為200時(shí),表示執(zhí)行成功。
print('result.status:', result.status)

拷貝大文件

對(duì)于大于1 GB的文件,需要使用分片拷貝(UploadPartCopy)。

UploadPartCopy默認(rèn)從一個(gè)已存在的Object的當(dāng)前版本中拷貝數(shù)據(jù)來上傳一個(gè)Part。允許通過在請(qǐng)求header : x-oss-copy-source中附帶versionId的子條件,實(shí)現(xiàn)從Object的指定版本進(jìn)行拷貝,例如x-oss-copy-source : /SourceBucketName/SourceObjectName?versionId=CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****。

說明

SourceObjectName要進(jìn)行URL編碼。響應(yīng)中將會(huì)返回被拷貝的Object版本ID,即x-oss-copy-source-version-id。

如果未指定versionId且拷貝Object的當(dāng)前版本為刪除標(biāo)記,OSS將返回404 Not Found。通過指定versionId來拷貝刪除標(biāo)記時(shí),OSS將返回400 Bad Request。

以下代碼用于分片拷貝。

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

# 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(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)拷貝文件時(shí),請(qǐng)確保源Bucket名稱和目標(biāo)Bucket名稱相同。
dest_bucket_name = 'destexamplebucket'
# yourEndpoint填寫B(tài)ucket所在地域?qū)?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)拷貝文件時(shí),請(qǐng)注釋掉該行代碼,并將后面的src_bucket改為bucket即可。
src_bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', src_bucket_name)

# 填寫源Object完整路徑,完整路徑中不能包含Bucket名稱,例如srcexampledir/exampleobject.txt。
src_object_name = 'srcexampledir/exampleobject.txt'
# 填寫目標(biāo)Object完整路徑,完整路徑中不能包含Bucket名稱,例如destexampledir/exampleobject.txt。
dest_object_name = 'destexampledir/exampleobject.txt'
# 填寫Object的版本ID。
versionId = 'CAEQQhiBgMC5kZDE4RciIGZmNzdlYzRjYzRkODQwYjQ5ZDE0Njg5MWM0ODQzNDg3'

params = dict()
params['versionId'] = versionId

# 獲取指定版本的源文件的文件大小。當(dāng)在同一Bucket內(nèi)拷貝文件時(shí),請(qǐng)將src_bucket改為bucket。
head_info = src_bucket.head_object(src_object_name, params=params)
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 = []

# 逐個(gè)上傳分片。
part_number = 1
offset = 0
while offset < total_size:
    num_to_upload = min(part_size, total_size - offset)
    end = offset + num_to_upload - 1
    result = bucket.upload_part_copy(src_bucket_name, src_object_name, (offset, end), dest_object_name, upload_id, part_number, params=params)
    # 保存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)
# 查看拷貝生成的目標(biāo)Object的versionId。
print('result version id:', result.versionid)
# 獲取文件元數(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)
# 對(duì)比源Object和目標(biāo)Object的大小。
assert dest_object_size == total_size

相關(guān)文檔

  • 關(guān)于拷貝小文件的更多信息,請(qǐng)參見CopyObject

  • 關(guān)于拷貝大文件的更多信息,請(qǐng)參見UploadPartCopy