You need to enable JavaScript to run this app.
导航

分片拷贝(.NET SDK)

最近更新时间2024.02.04 18:31:07

首次发布时间2023.08.24 14:41:47

对象大于5GiB时,您可以使用 UploadPartCopy 接口进行分片拷贝。

注意事项

  • 不支持跨区域的存储桶之间拷贝对象。
  • 拷贝对象时,账号必须具备源对象的读取权限和目标桶的写入权限。
  • 拷贝对象时,可以保留所有元数据(默认值)或指定新的元数据。但 ACL 并未被保留,而是设置为私有。

分片拷贝步骤

分片拷贝包括以下三个步骤:

  1. 通过 create_multipart_upload 初始化分片拷贝任务。
  2. 通过 upload_part_copy 进行分片拷贝。
  3. 通过 complete_multipart_upload 合并分片。

示例代码

以下代码用于将同一地域下源存储桶指定的对象分片拷贝到目标桶,分片大小设置为 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);
            }
        }
    }
}

相关文档