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

Go拷貝文件

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

注意事項

  • 本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地域的其他阿里云產品訪問OSS,請使用內網Endpoint。關于OSS支持的RegionEndpoint的對應關系,請參見OSS訪問域名、數據中心、開放端口。

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

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

  • 要拷貝文件,您必須有oss:GetObjectoss:PutObject權限。具體操作,請參見RAM用戶授權自定義的權限策略。

示例代碼

拷貝小文件

對于小于1 GB的文件,您可以通過CopyObject方法將文件從一個存儲空間(源存儲空間)復制到同一地域的另一個存儲空間(目標存儲空間)。

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

  • 您可以將Object的早期版本拷貝到同一個Bucket中,拷貝Object的歷史版本將會成為一個新的當前版本,達到恢復Object早期版本的目的。

  • 如果目標Bucket已開啟版本控制,OSS將會為新拷貝出來的Object自動生成唯一的versionId,此versionId將會在響應headerx-oss-version-id中返回。如果目標Bucket未曾開啟或者暫停了版本控制,OSS將會為新拷貝的Object自動生成versionId為”null“的版本,且會覆蓋原先versionId為”null“的版本。

  • 目標Bucket在開啟或暫停版本控制狀態下,不支持對Appendable類型Object執行拷貝操作。

以下代碼用于拷貝小文件:

package main

import (
	"log"
	"net/http"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// 創建OSSClient實例。
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 設置簽名版本
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Failed to create OSS client: %v", err)
	}

	// yourBucketName填寫存儲空間名稱。
	bucketName := "yourBucketName"
	// yourObjectName填寫不包含Bucket名稱在內的源Object的完整路徑。
	objectName := "yourObjectName"
	// yourDestObjectName填寫不包含Bucket名稱在內的目標Object的完整路徑。
	destObjectName := "yourDestObjectName"

	// 獲取Bucket實例。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
	}

	// 拷貝指定版本文件到同一個存儲空間的另一個文件,并獲取版本信息。
	var retHeader http.Header
	_, err = bucket.CopyObject(objectName, destObjectName, oss.VersionId("yourObjectVersionId"), oss.GetResponseHeader(&retHeader))
	if err != nil {
		log.Fatalf("Failed to copy object '%s' to '%s': %v", objectName, destObjectName, err)
	}

	// 打印版本信息。
	versionId := oss.GetVersionId(retHeader)
	copySourceVersionId := oss.GetCopySrcVersionId(retHeader)
	log.Printf("x-oss-version-id: %s", versionId)
	log.Printf("x-oss-copy-source-version-id: %s", copySourceVersionId)
}

拷貝大文件

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

UploadPartCopy默認從一個已存在的Object的當前版本中拷貝數據來上傳一個Part。允許通過在請求header : x-oss-copy-source中附帶versionId的子條件,實現從Object的指定版本進行拷貝,如x-oss-copy-source : /SourceBucketName/SourceObjectName?versionId=111111。

說明

SourceObjectName要進行URL編碼。響應中將會返回被拷貝Object的版本id:x-oss-copy-source-version-id。

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

以下代碼用于分片拷貝:

package main

import (
	"log"
	"net/http"
	"time"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// 創建OSSClient實例。
	// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
	// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 設置簽名版本
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Failed to create OSS client: %v", err)
	}

	// yourBucketName填寫存儲空間名稱。
	bucketName := "yourBucketName"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
	}

	// yourObjectName填寫不包含Bucket名稱在內的Object的完整路徑。
	objectName := "yourObjectName"
	fileName := "yourFileName"
	futureDate := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
	var retHeader http.Header

	// 分割文件。
	chunks, err := oss.SplitFileByPartNum(fileName, 3)
	if err != nil {
		log.Fatalf("Failed to split file '%s': %v", fileName, err)
	}

	// 上傳一個待拷貝的大文件。
	err = bucket.PutObjectFromFile(objectName, fileName, oss.GetResponseHeader(&retHeader))
	if err != nil {
		log.Fatalf("Failed to put object '%s' from file '%s': %v", objectName, fileName, err)
	}

	// 取得上傳源文件的versionId。
	versionId := oss.GetVersionId(retHeader)
	log.Printf("Source object version ID: %s", versionId)

	// 設置拷貝文件參數。
	options := []oss.Option{
		oss.Expires(futureDate),
		oss.Meta("my", "myprop"),
	}

	// 目標文件名。
	objectDest := objectName + "dest"
	var parts []oss.UploadPart
	copyOptions := []oss.Option{
		oss.VersionId(versionId),
		oss.GetResponseHeader(&retHeader),
	}

	// 初始化一個分片上傳事件。
	imu, err := bucket.InitiateMultipartUpload(objectDest, options...)
	if err != nil {
		log.Fatalf("Failed to initiate multipart upload for object '%s': %v", objectDest, err)
	}

	// 進行大文件拷貝。
	for _, chunk := range chunks {
		part, err := bucket.UploadPartCopy(imu, bucketName, objectName, chunk.Offset, chunk.Size, int(chunk.Number), copyOptions...)
		if err != nil {
			log.Fatalf("Failed to upload part %d of object '%s': %v", chunk.Number, objectName, err)
		}
		parts = append(parts, part)

		// 打印x-oss-copy-source-version-id。
		log.Printf("x-oss-copy-source-version-id: %s", oss.GetCopySrcVersionId(retHeader))
	}

	// 完成分片上傳。
	_, err = bucket.CompleteMultipartUpload(imu, parts, oss.GetResponseHeader(&retHeader))
	if err != nil {
		log.Fatalf("Failed to complete multipart upload for object '%s': %v", objectDest, err)
	}

	// 打印x-oss-version-id。
	log.Printf("x-oss-version-id: %s", oss.GetVersionId(retHeader))
}

相關文檔

  • 關于拷貝小文件的API接口說明,請參見CopyObject

  • 關于拷貝大文件的API接口說明,請參見UploadPartCopy。