开发者社区> 问答> 正文

.NET-SDK之如何实现管理文件(五)?


拷贝文件


在同一个区域(杭州,深圳,青岛等)中,用户可以对有操作权限的文件进行复制操作。

拷贝一个文件


通过 copyObject 方法我们可以拷贝一个文件,代码如下:

  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. /// <summary>
  5. /// 拷贝文件
  6. /// </summary>
  7. /// <param name="sourceBucket">原文件所在存储空间的名称</param>
  8. /// <param name="sourceKey">原文件的名称</param>
  9. /// <param name="targetBucket">目标文件所在存储空间的名称</param>
  10. /// <param name="targetKey">目标文件的名称</param>
  11. public void CopyObect(string sourceBucket, string sourceKey, string targetBucket, string targetKey)
  12. {
  13.     try
  14.     {
  15.         var metadata = new ObjectMetadata();
  16.         metadata.AddHeader(Util.HttpHeaders.ContentType, "text/html");
  17.         var req = new CopyObjectRequest(sourceBucket, sourceKey, targetBucket, targetKey)
  18.         {
  19.             NewObjectMetadata = metadata
  20.         };
  21.         var ret = client.CopyObject(req);
  22.         Console.WriteLine("Copy object succeeded");
  23.         Console.WriteLine("文件的ETag:{0}", ret.ETag);
  24.     }
  25.     catch (Exception ex)
  26.     {
  27.         Console.WriteLine("Copy object failed. {0}", ex.Message);
  28.     }
  29. }

说明:
  • 完整代码参考GitHub
  • 使用该方法拷贝的文件必须小于1G,否则会报错。若文件大于1G,使用下面的Upload Part Copy。


拷贝大文件



初始化Multipart Upload


我们使用 initiateMultipartUpload 方法来初始化一个分片上传事件:
  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. public void InitiateMultipartUpload(string bucketName, string key)
  5. {
  6.     try
  7.     {
  8.         // 开始Multipart Upload
  9.         var request = new InitiateMultipartUploadRequest(bucketName, key);
  10.         var result = client.InitiateMultipartUpload(request);
  11.         // 打印UploadId
  12.         Console.WriteLine("Init multipart upload succeeded");
  13.         Console.WriteLine("Upload Id:{0}", result.UploadId);
  14.     }
  15.     catch (Exception ex)
  16.     {
  17.         Console.WriteLine("Init multipart upload failed. {0}", ex.Message);
  18.     }
  19. }

说明: 完整代码参考 GitHub


Upload Part Copy拷贝上传


Upload Part Copy 通过从一个已经存在文件的中拷贝数据来上传一个新文件。当拷贝一个大于500MB的文件,建议使用Upload Part Copy的方式来进行拷贝。
  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. public void UploadPartCopy(string sourceBucket, string sourceKey, string targetBucket, string targetKey, string uploadId)
  5. {
  6.     try
  7.     {
  8.         // 计算总共的分片个数
  9.         var metadata = client.GetObjectMetadata(sourceBucket, sourceKey);
  10.         var fileSize = metadata.ContentLength;
  11.         var partCount = (int)fileSize / partSize;
  12.         if (fileSize % partSize != 0)
  13.         {
  14.             partCount++;
  15.         }
  16.         // 开始分片拷贝
  17.         var partETags = new List<PartETag>();
  18.         for (var i = 0; i < partCount; i++)
  19.         {
  20.             var skipBytes = (long)partSize * i;
  21.             var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
  22.             var request = new UploadPartCopyRequest(targetBucket, targetKey, sourceBucket, sourceKey, uploadId)
  23.             {
  24.                 PartSize = size,
  25.                 PartNumber = i + 1,
  26.                 BeginIndex = skipBytes
  27.             };
  28.             var result = client.UploadPartCopy(request);
  29.             partETags.Add(result.PartETag);
  30.         }
  31.         Console.WriteLine("Upload part copy succeeded");
  32.     }
  33.     catch (Exception ex)
  34.     {
  35.         Console.WriteLine("Upload part copy failed. {0}", ex.Message);
  36.     }

说明:
  • 完整代码参考GitHub
  • 以上程序调用uploadPartCopy方法来拷贝每一个分片。
  • 与UploadPart要求基本一致,需要通过BeginIndex来定位到此次上传片开头所对应的位置,同时需要通过SourceKey来指定拷贝的文件。

展开
收起
青衫无名 2017-10-18 15:21:53 1716 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
从 SDK 到编解码:视频直播架构解析 立即下载
跨平台的云服务SDK需要什么 立即下载
一个跨平台的云服务SDK需要什么 立即下载