开发者社区 问答 正文

.NET-SDK之如何实现上传文件(三)?


追加上传


追加写的方式上传文件。详细介绍请参考 API

  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. /// <summary>
  5. /// 追加内容到指定的OSS文件中。
  6. /// </summary>
  7. /// <param name="bucketName">指定的存储空间名称。</param>
  8. /// <param name="key">OSS上会被追加内容的文件名称。</param>
  9. /// <param name="fileToUpload">指定被追加的文件的路径。</param>
  10. public static void AppendObject(string bucketName, string key, string fileToUpload)
  11. {
  12.     //第一次追加文件的时候,文件可能已经存在,先获取文件的当前长度,如果不存在,position为0
  13.     long position = 0;
  14.     try
  15.     {
  16.         var metadata = client.GetObjectMetadata(bucketName, key);
  17.         position = metadata.ContentLength;
  18.     }
  19.     catch(Exception)  {}
  20.     try
  21.     {
  22.         using (var fs = File.Open(fileToUpload, FileMode.Open))
  23.         {
  24.             var request = new AppendObjectRequest(bucketName, key)
  25.             {
  26.                 ObjectMetadata = new ObjectMetadata(),
  27.                 Content = fs,
  28.                 Position = position
  29.             };
  30.             var result = client.AppendObject(request);
  31.             // 设置下次追加文件时的position位置
  32.             position = result.NextAppendPosition;
  33.             Console.WriteLine("Append object succeeded, next append position:{0}", position);
  34.         }
  35.         // 再次追加文件,这时候的position值可以从上次的结果中获取到
  36.         using (var fs = File.Open(fileToUpload, FileMode.Open))
  37.         {
  38.             var request = new AppendObjectRequest(bucketName, key)
  39.             {
  40.                 ObjectMetadata = new ObjectMetadata(),
  41.                 Content = fs,
  42.                 Position = position
  43.             };
  44.             var result = client.AppendObject(request);
  45.             position = result.NextAppendPosition;
  46.             Console.WriteLine("Append object succeeded, next append position:{0}", position);
  47.         }
  48.     }
  49.     catch (Exception ex)
  50.     {
  51.         Console.WriteLine("Append object failed, {0}", ex.Message);
  52.     }
  53. }

说明:


分片上传


除了通过PutObject接口上传文件到OSS以外,OSS还提供了另外一种上传模式 —— Multipart Upload。
用户可以在如下的应用场景内(但不仅限于此),使用Multipart Upload上传模式,如:
  • 需要支持断点上传。
  • 上传超过100MB大小的文件。
  • 网络条件较差,和OSS的服务器之间的链接经常断开。
  • 上传文件之前,无法确定上传文件的大小。

下面我们将一步步学习怎样实现Multipart Upload。

分步完成Multipart Upload



初始化Multipart Upload


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

说明:
  • 完整代码参考GitHub
  • 我们用InitiateMultipartUploadRequest来指定上传文件的名字和所属存储空间(Bucket)。
  • 在InitiateMultipartUploadRequest中,您也可以设置ObjectMeta,但是不必指定其中的ContentLength。
  • initiateMultipartUpload 的返回结果中含有UploadId ,它是区分分片上传事件的唯一标识,在后面的操作中,我们将用到它。

展开
收起
青衫无名 2017-10-18 14:59:50 1355 分享 版权
0 条回答
写回答
取消 提交回答