对象大于5GiB时,您可以使用 UploadPartCopy 接口进行分片拷贝。
分片拷贝包括以下三个步骤:
以下代码用于将同一地域下源存储桶指定的对象分片拷贝到目标桶,分片大小设置为 20M。
using System; using System.IO; using TOS; using TOS.Error; using TOS.Model; namespace ConsoleApp { internal class Program { private static void Main(string[] args) { var ak = Environment.GetEnvironmentVariable("TOS_ACCESS_KEY"); var sk = Environment.GetEnvironmentVariable("TOS_SECRET_KEY"); // endpoint 若没有指定HTTP协议(HTTP/HTTPS),默认使用 HTTPS // Bucket 的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com var endpoint = "https://tos-cn-beijing.volces.com"; var region = "cn-beijing"; // 填写 BucketName var srcBucketName = "*** Provide your bucket name ***"; var dstBucketName = "*** Provide your dst bucket name ***"; // 复制源对象 key var srcObjectKey = "srcObjectKey"; var dstObjectKey = "objectKey"; // 创建TOSClient实例 var client = TosClientBuilder.Builder().SetAk(ak).SetSk(sk).SetEndpoint(endpoint).SetRegion(region).Build(); try { // 获取桶源桶中已存在对象的大小 var headObjectInput = new HeadObjectInput() { Bucket = srcBucketName, Key = srcObjectKey, }; var headObjectOutput = client.HeadObject(headObjectInput); var totalSize = headObjectOutput.ContentLength; // part size 大小设置为 20M Int64 partSize = 20 * 1024 * 1024; // 计算分片信息 var partCount = totalSize / partSize; if (totalSize % partSize != 0) { partCount++; } var parts = new UploadedPart[partCount]; // 创建分片任务 var createMultipartUploadInput = new CreateMultipartUploadInput() { Bucket = dstBucketName, Key = dstObjectKey }; var createMultipartUploadOutput = client.CreateMultipartUpload(createMultipartUploadInput); var uploadId = createMultipartUploadOutput.UploadID; // 复制上传分片 for (var i = 0; i < partCount; i++) { var offset = partSize * i; // 计算本次上传的分片大小,最后一片为剩余的数据大小。 var contentSize = (partSize < totalSize - offset) ? partSize : (totalSize - offset); var uploadPartCopyInput = new UploadPartCopyInput() { Bucket = dstBucketName, Key = dstObjectKey, SrcBucket = srcBucketName, SrcKey = srcObjectKey, UploadID = uploadId, // partNumber 编号从 1 开始 PartNumber = i + 1, CopySourceRangeStart = offset, CopySourceRangeEnd = offset + contentSize - 1 }; var uploadPartCopyOutput = client.UploadPartCopy(uploadPartCopyInput); parts[i] = new UploadedPart { PartNumber = i + 1, ETag = uploadPartCopyOutput.ETag }; Console.WriteLine("UploadPartCopy succeeded, request id {0}", uploadPartCopyOutput.RequestID); } var completeMultipartUploadInput = new CompleteMultipartUploadInput() { Bucket = dstBucketName, Key = dstObjectKey, UploadID = uploadId, Parts = parts }; var completeMultipartUploadOutput = client.CompleteMultipartUpload(completeMultipartUploadInput); Console.WriteLine("CompleteMultipartUpload succeeded, request id {0}", completeMultipartUploadOutput.RequestID); } catch (TosServerException ex) { Console.WriteLine("Copy failed, request id {0}", ex.RequestID); Console.WriteLine("Copy failed, status code {0}", ex.StatusCode); Console.WriteLine("Copy failed, response error code {0}", ex.Code); Console.WriteLine("Copy failed, response error message {0}", ex.Message); } catch (TosClientException ex) { Console.WriteLine("Copy failed, error message {0}", ex.Message); } catch (Exception ex) { Console.WriteLine("Copy failed, {0}", ex.Message); } } } }