全部产品
对象存储 OSS

下载文件

更新时间:2017-06-07 13:26:11   分享:   

简单的下载文件

我们可以通过以下代码将文件读取到一个流中:

  1. // 初始化OssClient
  2. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  3. /// <summary>
  4. /// 从指定的OSS存储空间中获取指定的文件
  5. /// </summary>
  6. /// <param name="bucketName">要获取的文件所在的存储空间的名称</param>
  7. /// <param name="key">要获取的文件的名称</param>
  8. /// <param name="fileToDownload">文件保存的本地路径</param>
  9. public void GetObject(string bucketName, string key, string fileToDownload)
  10. {
  11. try
  12. {
  13. var object = client.GetObject(bucketName, key);
  14. using (var requestStream = object.Content)
  15. {
  16. byte[] buf = new byte[1024];
  17. var fs = File.Open(fileToDownload, FileMode.OpenOrCreate);
  18. var len = 0;
  19. while ((len = requestStream.Read(buf, 0, 1024)) != 0)
  20. {
  21. fs.Write(buf, 0, len);
  22. }
  23. fs.Close();
  24. }
  25. Console.WriteLine("Get object succeeded");
  26. }
  27. catch (Exception ex)
  28. {
  29. Console.WriteLine("Get object failed. {0}", ex.Message);
  30. }
  31. }

提示:

  • 完整代码参考:GitHub
  • OssObject 包含了文件的各种信息,包含文件所在的存储空间(Bucket)、文件的名称、Metadata以及一个输入流。
  • 我们可以通过操作输入流将文件的内容读取到文件或者内存中。而ObjectMeta包含了文件上传时定义的,ETag,Http Header以及自定义的元信息。

分段读取文件

为了实现更多的功能,我们可以通过使用 GetObjectRequest 来读取文件,比如分段读取:

  1. // 初始化OssClient
  2. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  3. public void GetObject(string bucketName, string key, string fileToDownload)
  4. {
  5. try
  6. {
  7. var getObjectRequest = new GetObjectRequest(bucketName, key);
  8. //读取文件中的20到100个字符,包括第20和第100个字符
  9. getObjectRequest.SetRange(20, 100);
  10. var object = client.GetObject(getObjectRequest);
  11. // 将读到的数据写到fielToDownload文件中去
  12. using (var requestStream = object.Content)
  13. {
  14. byte[] buf = new byte[1024];
  15. var fs = File.Open(fileToDownload, FileMode.OpenOrCreate);
  16. var len = 0;
  17. while ((len = requestStream.Read(buf, 0, 1024)) != 0)
  18. {
  19. fs.Write(buf, 0, len);
  20. }
  21. fs.Close();
  22. }
  23. Console.WriteLine("Get object succeeded");
  24. }
  25. catch (Exception ex)
  26. {
  27. Console.WriteLine("Get object failed. {0}", ex.Message);
  28. }
  29. }

提示:

  • 完整代码参考:GitHub
  • 我们通过GetObjectRequest的setRange方法设置了返回的文件的范围。
  • 我们可以用此功能实现文件的分段下载和断点续传。
  • GetObjectRequest可以设置以下参数:
参数 说明
Range 指定文件传输的范围。
ModifiedSinceConstraint 如果指定的时间早于实际修改时间,则正常传送文件。否则抛出304 Not Modified异常。
UnmodifiedSinceConstraint 如果传入参数中的时间等于或者晚于文件实际修改时间,则正常传输文件。否则抛出412 precondition failed异常
MatchingETagConstraints 传入一组ETag,如果传入期望的ETag和文件的 ETag匹配,则正常传输文件。否则抛出412 precondition failed异常
NonmatchingEtagConstraints 传入一组ETag,如果传入的ETag值和文件的ETag不匹配,则正常传输文件。否则抛出304 Not Modified异常。
ResponseHeaderOverrides 自定义OSS返回请求中的一些Header。

只获取文件元信息

通过GetObjectMetadata方法可以只获取ObjectMeta而不获取文件的实体。代码如下:

  1. // 初始化OssClient
  2. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  3. /// <summary>
  4. /// 获取文件的元信息。
  5. /// </summary>
  6. /// <param name="bucketName">存储空间的名称</param>
  7. /// <param name="key">文件在OSS上的名称</param>
  8. public void GetObjectMetadata(string bucketName, string key)
  9. {
  10. try
  11. {
  12. var metadata = client.GetObjectMetadata(bucketName, key);
  13. Console.WriteLine("Get object meta succeeded");
  14. Console.WriteLine("Content-Type:{0}", metadata.ContentType);
  15. Console.WriteLine("Cache-Control:{0}", metadata.CacheControl);
  16. }
  17. catch (Exception ex)
  18. {
  19. Console.WriteLine("Get object meta failed. {0}", ex.Message);
  20. }
  21. }

进度条

OSS .Net SDK支持进度条功能,指示上传、下载的进度。下面的代码以 GetObject 为例,说明进度条功能的使用方法。

  1. using Aliyun.OSS;
  2. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  3. public static void GetObjectProgress(string bucketName)
  4. {
  5. const string key = "GetObjectProgress";
  6. try
  7. {
  8. client.PutObject(bucketName, key, fileToUpload);
  9. var getObjectRequest = new GetObjectRequest(bucketName, key);
  10. getObjectRequest.StreamTransferProgress += streamProgressCallback;
  11. var ossObject = client.GetObject(getObjectRequest);
  12. using (var stream = ossObject.Content)
  13. {
  14. var buffer = new byte[1024 * 1024];
  15. var bytesRead = 0;
  16. while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
  17. {
  18. // 处理读出的数据
  19. }
  20. }
  21. Console.WriteLine("Get object:{0} succeeded", key);
  22. }
  23. catch (OssException ex)
  24. {
  25. Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
  26. ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
  27. }
  28. catch (Exception ex)
  29. {
  30. Console.WriteLine("Failed with error info: {0}", ex.Message);
  31. }
  32. }
  33. private static void streamProgressCallback(object sender, StreamTransferProgressArgs args)
  34. {
  35. System.Console.WriteLine("ProgressCallback - TotalBytes:{0}, TransferredBytes:{1}",
  36. args.TotalBytes, args.TransferredBytes);
  37. }

提示:

  • PutObject、AppendObject、UploadPart、ResumableUploadObject、GetObject都支持进度功能,完整代码请参考:GitHub
本文导读目录
本文导读目录
以上内容是否对您有帮助?