开发者社区 问答 正文

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

在OSS中,用户操作的基本数据单元是文件(Object)。单个文件最大允许大小根据上传数据方式不同而不同,Put Object方式最大不能超过5GB, 使用multipart上传方式文件大小不能超过48.8TB。

简单的上传



上传指定字符串:

  1. using System.Text;
  2. using Aliyun.OSS;
  3. // 初始化OssClient
  4. var client = new OssClient(endpoint, accessKeyId, accessKeySecret)
  5. try
  6. {
  7.     string str = "a line of simple text";
  8.     byte[] binaryData = Encoding.ASCII.GetBytes(str);            
  9.     MemoryStream requestContent = new MemoryStream(binaryData);
  10.     client.PutObject(bucketName, key, requestContent);
  11.     Console.WriteLine("Put object succeeded");
  12. }
  13. catch (Exception ex)
  14. {
  15.     Console.WriteLine("Put object failed, {0}", ex.Message);
  16. }

说明: 完整代码参考: GitHub


上传指定的本地文件

  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. try
  5. {
  6.     string fileToUpload = "your local file path";
  7.     client.PutObject(bucketName, key, fileToUpload);
  8.     Console.WriteLine("Put object succeeded");
  9. }
  10. catch (Exception ex)
  11. {
  12.     Console.WriteLine("Put object failed, {0}", ex.Message);
  13. }

说明: 完整代码参考 GitHub


上传文件并且带MD5校验

  1. using Aliyun.OSS;
  2. using Aliyun.OSS.util;
  3. // 初始化OssClient
  4. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  5. try
  6. {
  7.     string fileToUpload = "your local file path";
  8.     string md5;
  9.     using (var fs = File.Open(fileToUpload, FileMode.Open));
  10.     {
  11.         md5 = OssUtils.ComputeContentMd5(fs, fs.Length);
  12.     }  
  13.     var objectMeta = new ObjectMetadata
  14.     {
  15.         ContentMd5 = md5
  16.     };
  17.     client.PutObject(bucketName, key, fileToUpload, objectMeta);
  18.     Console.WriteLine("Put object succeeded");
  19. }
  20. catch (Exception ex)
  21. {
  22.     Console.WriteLine("Put object failed, {0}", ex.Message);
  23. }

说明:
  • 完整代码参考GitHub
  • 为了保证SDK发送的数据和OSS服务端接收到的数据一致,可以在ObjectMeta中增加Content-Md5值,这样服务端就会使用这个MD5值做校验。
  • 使用Md5时,性能会有所损失。


上传文件带Header



带标准Header


OSS服务允许用户自定义文件的Http Header。下面代码为文件设置了过期时间:
  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. try
  5. {
  6.     using (var fs = File.Open(fileToUpload, FileMode.Open))
  7.     {
  8.         var metadata = new ObjectMetadata();                    
  9.         metadata.ContentLength = fs.Length;
  10.         metadata.ExpirationTime = DateTime.Parse("2015-10-12T00:00:00.000Z");      
  11.         client.PutObject(bucketName, key, fs, metadata);    
  12.         Console.WriteLine("Put object succeeded");
  13.     }
  14. }
  15. catch (Exception ex)
  16. {
  17.     Console.WriteLine("Put object failed, {0}", ex.Message);
  18. }

说明:
  • 完整代码参考GitHub
  • .NET SDK支持的Http Header:Cache-Control 、 Content-Disposition 、Content-Encoding 、 Expires、Content-Type等 。
  • 它们的相关介绍见 RFC2616


带自定义Header


OSS支持用户自定义元信息来对文件进行描述。比如:
  1. using Aliyun.OSS;
  2. // 初始化OssClient
  3. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  4. try
  5. {
  6.     using (var fs = File.Open(fileToUpload, FileMode.Open))
  7.     {
  8.         var metadata = new ObjectMetadata();
  9.         metadata.UserMetadata.Add("name", "my-data");
  10.         metadata.ContentLength = fs.Length;
  11.         client.PutObject(bucketName, key, fs, metadata);  
  12.         Console.WriteLine("Put object succeeded");
  13.     }
  14. }
  15. catch (Exception ex)
  16. {
  17.     Console.WriteLine("Put object failed, {0}", ex.Message);
  18. }

说明:
  • 完整代码参考GitHub
  • 在上面代码中,用户自定义了一个名字为“name”,值为“my-data”的元信息。
  • 当用户下载此文件的时候,此元信息也可以一并得到。
  • 一个文件可以有多个类似的参数,但所有的user meta总大小不能超过2KB。
  • 使用上述方法上传最大文件不能超过5G。如果超过可以使用MutipartUpload上传。
  • user meta的名称大小写不敏感,比如用户上传文件时,定义名字为“Name”的meta,在表头中存储的参数为:“x-oss-meta-name”,所以读取时读取名字为“name”的参数即可。
  • 但如果存入参数为“name”,读取时使用“Name”读取不到对应信息,会返回“null”。


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