全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
对象存储 OSS

快速入门

更新时间:2017-11-22 17:51:49

在这一章里,我们将学到如何用OSS .NET SDK完成一些基本的操作。

Step-1.初始化一个OssClient

SDK的OSS操作通过OssClient类完成的,下面代码创建一个OssClient对象:

  1. using Aliyun.OSS;
  2. /// <summary>
  3. /// 由用户指定的OSS访问地址、阿里云颁发的AccessKeyId/AccessKeySecret构造一个新的OssClient实例。
  4. /// </summary>
  5. /// <param name="endpoint">OSS的访问地址。</param>
  6. /// <param name="accessKeyId">OSS的访问ID。</param>
  7. /// <param name="accessKeySecret">OSS的访问密钥。</param>
  8. public void CreateClient(string endpoint, string accessKeyId, string accessKeySecret)
  9. {
  10. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  11. }

提示:

  • 在上面代码中,变量 accessKeyId 与 accessKeySecret 是由系统分配给用户的,用于标识用户,可能属于您的阿里云账号或者RAM账号。
  • 关于OssClient的详细介绍,参见 初始化

Step-2. 新建存储空间

存储空间(Bucket)是OSS全局命名空间,相当于数据的容器,可以存储若干文件。您可以按照下面的代码新建一个存储空间:

  1. using Aliyun.OSS;
  2. /// <summary>
  3. /// 在OSS中创建一个新的存储空间。
  4. /// </summary>
  5. /// <param name="bucketName">要创建的存储空间的名称</param>
  6. public void CreateBucket(string bucketName)
  7. {
  8. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  9. try
  10. {
  11. var bucket = client.CreateBucket(bucketName);
  12. Console.WriteLine("Create bucket succeeded.");
  13. Console.WriteLine("Name:{0}", bucket.Name);
  14. }
  15. catch (Exception ex)
  16. {
  17. Console.WriteLine("Create bucket failed, {0}", ex.Message);
  18. }
  19. }

提示:

  • 关于存储空间的命名规范,参见管理Bucket中的命名规范。

Step-3. 上传文件

文件(Object)是OSS中最基本的数据单元,用下面代码可以实现上传文件:

  1. using Aliyun.OSS;
  2. /// <summary>
  3. /// 上传指定的文件到指定的OSS的存储空间
  4. /// </summary>
  5. /// <param name="bucketName">指定的存储空间名称</param>
  6. /// <param name="key">文件的在OSS上保存的名称</param>
  7. /// <param name="fileToUpload">指定上传文件的本地路径</param>
  8. public void PutObject(string bucketName, string key, string fileToUpload)
  9. {
  10. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  11. try
  12. {
  13. var result = client.PutObject(bucketName, key, fileToUpload);
  14. Console.WriteLine("Put object succeeded");
  15. Console.WriteLine("ETag:{0}", result.ETag);
  16. }
  17. catch (Exception ex)
  18. {
  19. Console.WriteLine("Put object failed, {0}", ex.Message);
  20. }
  21. }

注意:

  • 每个上传的文件,都可以指定和此文件关联的ObjectMeta。
  • ObjectMeta是用户对该文件的描述,由一系列key-value对组成;
  • 为了保证上传文件服务器端与本地一致,用户可以设置Content-MD5,OSS会计算上传数据的MD5值并与用户上传的MD5值比较,如果不一致返回InvalidDigest错误码。
  • 计算出来的Content-MD5需要在上传时设置给ObjectMetadata的ETag。
  • 关于文件的命名规范和其他更详细的信息,参见上传文件

Step-4. 列出所有文件

当您完成一系列上传后,可能需要查看某个存储空间中有哪些文件,可以通过下面的程序实现:

  1. using Aliyun.OSS;
  2. /// <summary>
  3. /// 列出指定存储空间的文件列表
  4. /// </summary>
  5. /// <param name="bucketName">存储空间的名称</param>
  6. public void ListObjects(string bucketName)
  7. {
  8. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  9. try
  10. {
  11. var listObjectsRequest = new ListObjectsRequest(bucketName);
  12. var result = client.ListObjects(listObjectsRequest);
  13. Console.WriteLine("List object succeeded");
  14. foreach (var summary in result.ObjectSummaries)
  15. {
  16. Console.WriteLine(summary.Key);
  17. }
  18. }
  19. catch (Exception ex)
  20. {
  21. Console.WriteLine("List object failed, {0}", ex.Message);
  22. }
  23. }

Step-5. 获取指定文件

您可以参考下面的代码简单地实现一个文件的获取:

  1. using Aliyun.OSS;
  2. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  3. /// <summary>
  4. /// 从指定的OSS存储空间中获取指定的文件
  5. /// </summary>
  6. /// <param name="bucketName">要获取的文件所在的存储空间名称</param>
  7. /// <param name="key">要获取的文件在OSS上的名称</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. //将从OSS读取到的文件写到本地
  15. using (var requestStream = object.Content)
  16. {
  17. byte[] buf = new byte[1024];
  18. using (var fs = File.Open(fileToDownload, FileMode.OpenOrCreate);
  19. {
  20. var len = 0;
  21. while ((len = requestStream.Read(buf, 0, 1024)) != 0)
  22. {
  23. fs.Write(buf, 0, len);
  24. }
  25. }
  26. }
  27. }
  28. catch (Exception ex)
  29. {
  30. Console.WriteLine("Get object failed, {0}", ex.Message);
  31. }
  32. }

提示:

  • 当调用OssClient的GetObject方法时,会返回一个OssObject的对象,此对象包含了文件的各种信息。
  • 通过OssObject的GetObjectContent方法,可以获取返回的文件的输入流,通过读取此输入流获取此文件的内容,在用完之后关闭这个流。

Step-6. 删除指定文件

您可以参考下面的代码实现一个文件的删除:

  1. using Aliyun.OSS;
  2. /// <summary>
  3. /// 删除指定的文件
  4. /// </summary>
  5. /// <param name="bucketName">文件所在存储空间的名称</param>
  6. /// <param name="key">待删除的文件名称</param>
  7. public void DeleteObject(string bucketName, string key)
  8. {
  9. var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  10. try
  11. {
  12. client.DeleteObject(bucketName, key);
  13. Console.WriteLine("Delete object succeeded");
  14. }
  15. catch (Exception ex)
  16. {
  17. Console.WriteLine("Delete object failed, {0}", ex.Message);
  18. }
  19. }

示例程序

下面是一个完整的程序,演示了创建存储空间,设置存储空间ACL,查询存储空间的ACL,上传文件,下载文件,查询文件列表,删除文件,删除存储空间等操作。

  1. using System;
  2. using System.Collections.Generic;
  3. using Aliyun.OSS;
  4. namespace TaoYe
  5. {
  6. /// <summary>
  7. /// 快速入门示例程序
  8. /// </summary>
  9. public static class SimpleSamples
  10. {
  11. private const string _accessKeyId = "<your AccessKeyId>";
  12. private const string _accessKeySecret = "<your AccessKeySecret>";
  13. private const string _endpoint = "<valid host name>";
  14. private const string _bucketName = "<your bucket name>";
  15. private const string _key = "<your key>";
  16. private const string _fileToUpload = "<your local file path>";
  17. private static OssClient _client = new OssClient(_endpoint, _accessKeyId, _accessKeySecret);
  18. public static void Main(string[] args)
  19. {
  20. CreateBucket();
  21. SetBucketAcl();
  22. GetBucketAcl();
  23. PutObject();
  24. ListObjects();
  25. GetObject();
  26. DeleteObject();
  27. // DeleteBucket();
  28. Console.WriteLine("Press any key to continue . . . ");
  29. Console.ReadKey(true);
  30. }
  31. /// <summary>
  32. /// 创建一个新的存储空间
  33. /// </summary>
  34. private static void CreateBucket()
  35. {
  36. try
  37. {
  38. var result = _client.CreateBucket(_bucketName);
  39. Console.WriteLine("创建存储空间{0}成功", result.Name);
  40. }
  41. catch (Exception ex)
  42. {
  43. Console.WriteLine("创建存储空间失败. 原因:{0}", ex.Message);
  44. }
  45. }
  46. /// <summary>
  47. /// 上传一个新文件
  48. /// </summary>
  49. private static void PutObject()
  50. {
  51. try
  52. {
  53. _client.PutObject(_bucketName, _key, _fileToUpload);
  54. Console.WriteLine("上传文件成功");
  55. }
  56. catch (Exception ex)
  57. {
  58. Console.WriteLine("上传文件失败.原因: {0}", ex.Message);
  59. }
  60. }
  61. /// <summary>
  62. /// 列出存储空间内的所有文件
  63. /// </summary>
  64. private static void ListObjects()
  65. {
  66. try
  67. {
  68. var keys = new List<string>();
  69. ObjectListing result = null;
  70. string nextMarker = string.Empty;
  71. /// 由于ListObjects每次最多返回100个结果,所以,这里需要循环去获取,直到返回结果中IsTruncated为false
  72. do
  73. {
  74. var listObjectsRequest = new ListObjectsRequest(_bucketName)
  75. {
  76. Marker = nextMarker,
  77. MaxKeys = 100
  78. };
  79. result = _client.ListObjects(listObjectsRequest);
  80. foreach (var summary in result.ObjectSummaries)
  81. {
  82. keys.Add(summary.Key);
  83. }
  84. nextMarker = result.NextMarker;
  85. } while (result.IsTruncated);
  86. Console.WriteLine("列出存储空间中的文件");
  87. foreach (var key in keys)
  88. {
  89. Console.WriteLine("文件名称:{0}", key);
  90. }
  91. }
  92. catch (Exception ex)
  93. {
  94. Console.WriteLine("列出存储空间中的文件失败.原因: {0}", ex.Message);
  95. }
  96. }
  97. /// <summary>
  98. /// 下载文件
  99. /// </summary>
  100. private static void GetObject()
  101. {
  102. try
  103. {
  104. var result = _client.GetObject(_bucketName, _key);
  105. Console.WriteLine("下载的文件成功,名称是:{0},长度:{1}", result.Key, result.Metadata.ContentLength);
  106. }
  107. catch (Exception ex)
  108. {
  109. Console.WriteLine("下载文件失败.原因:{0}", ex.Message);
  110. }
  111. }
  112. /// <summary>
  113. /// 删除文件
  114. /// </summary>
  115. private static void DeleteObject()
  116. {
  117. try
  118. {
  119. _client.DeleteObject(_bucketName, _key);
  120. Console.WriteLine("删除文件成功");
  121. }
  122. catch (Exception ex)
  123. {
  124. Console.WriteLine("删除文件失败.原因: {0}", ex.Message);
  125. }
  126. }
  127. /// <summary>
  128. /// 获取存储空间ACL的值
  129. /// </summary>
  130. private static void GetBucketAcl()
  131. {
  132. try
  133. {
  134. var result = _client.GetBucketAcl(_bucketName);
  135. foreach (var grant in result.Grants)
  136. {
  137. Console.WriteLine("获取存储空间权限成功,当前权限:{0}", grant.Permission.ToString());
  138. }
  139. }
  140. catch (Exception ex)
  141. {
  142. Console.WriteLine("获取存储空间权限失败.原因: {0}", ex.Message);
  143. }
  144. }
  145. /// <summary>
  146. /// 设置存储空间ACL的值
  147. /// </summary>
  148. private static void SetBucketAcl()
  149. {
  150. try
  151. {
  152. _client.SetBucketAcl(_bucketName, CannedAccessControlList.PublicRead);
  153. Console.WriteLine("设置存储空间权限成功");
  154. }
  155. catch (Exception ex)
  156. {
  157. Console.WriteLine("设置存储空间权限失败. 原因:{0}", ex.Message);
  158. }
  159. }
  160. /// <summary>
  161. /// 删除存储空间
  162. /// </summary>
  163. private static void DeleteBucket()
  164. {
  165. try
  166. {
  167. _client.DeleteBucket(_bucketName);
  168. Console.WriteLine("删除存储空间成功");
  169. }
  170. catch (Exception ex)
  171. {
  172. Console.WriteLine("删除存储空间失败", ex.Message);
  173. }
  174. }
  175. }
  176. }
本文导读目录