一.  上传示例

  Install-Package AWSSDK.S3 -Version 3.3.104.10

  1. using Amazon;
  2. using Amazon.Runtime;
  3. using Amazon.S3;
  4. using Amazon.S3.Model;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.IO;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. /*
  11. //上传篮球资料图片
  12. AwsS3Helper s3 = new AwsS3Helper(ResourceType.basketballnewsImg);
  13. s3.WritingAnObjectAsync("E:\\11\\test1.jpg").Wait();
  14. */
  15. namespace AwsS3WithNetCore
  16. {
  17. /// <summary>
  18. ///Amazon S3 上传数据(照片、视频、文档等)
  19. /// </summary>
  20. public class AwsS3Helper
  21. {
  22. /// <summary>
  23. /// 地区是亚太香港
  24. /// </summary>
  25. readonly RegionEndpoint bucketRegion = RegionEndpoint.GetBySystemName("ap-east-1");
  26. /// <summary>
  27. /// 要向 Amazon S3 上传数据(照片、视频、文档等),
  28. /// 您必须首先在其中一个 AWS 区域中创建 S3 存储桶, 比如:在亚太香港地址,创建了一个gfbk桶
  29. /// 然后,您可以将任何数量的对象上传到该存储桶。
  30. /// 每个 AWS 账户中创建多达 100 个存储桶,一个存储桶中可以存储任意数量的对象。
  31. /// 资料:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/UsingBucket.html
  32. /// </summary>
  33. readonly string bucketName = Constants.bucketName;
  34. /// <summary>
  35. /// 请求S3的凭据
  36. /// </summary>
  37. readonly AWSCredentials awsCredentials = new BasicAWSCredentials(Constants.accessKey, Constants.secretKey);
  38. /// <summary>
  39. /// 请求客户端
  40. /// </summary>
  41. AmazonS3Client client = null;
  42. /// <summary>
  43. /// 上传资源类型
  44. /// </summary>
  45. ResourceType _resourceType;
  46. public AwsS3Helper(ResourceType resourceType)
  47. {
  48. _resourceType = resourceType;
  49. client = new AmazonS3Client(awsCredentials, bucketRegion);
  50. }
  51. /// <summary>
  52. ///创建一个桶
  53. /// </summary>
  54. /// <returns></returns>
  55. public async Task CreateBucket()
  56. {
  57. var putBucketRequest = new PutBucketRequest
  58. {
  59. BucketName = bucketName,
  60. UseClientRegion = true
  61. };
  62. PutBucketResponse putBucketResponse = await client.PutBucketAsync(putBucketRequest);
  63. string bucketLocation = await FindBucketLocationAsync(client);
  64. }
  65. /// <summary>
  66. /// 查找桶所在的地区
  67. /// </summary>
  68. /// <param name="client"></param>
  69. /// <returns></returns>
  70. private async Task<string> FindBucketLocationAsync(IAmazonS3 client)
  71. {
  72. string bucketLocation;
  73. var request = new GetBucketLocationRequest()
  74. {
  75. BucketName = bucketName
  76. };
  77. GetBucketLocationResponse response = await client.GetBucketLocationAsync(request);
  78. bucketLocation = response.Location.ToString();
  79. return bucketLocation;
  80. }
  81. /// <summary>
  82. /// 上传文件
  83. /// </summary>
  84. /// <param name="uploadFilePath">上传的文件地址如:E:\test.jpg</param>
  85. /// <returns></returns>
  86. public async Task<bool> WritingAnObjectAsync(string uploadFilePath)
  87. {
  88. try
  89. {
  90. string filename = uploadFilePath.Substring(uploadFilePath.LastIndexOf('\\')+1);
  91. string key = string.Format("resource/img/{0}/{1}", _resourceType.ToString().Replace("Img", ""), filename);
  92. var putRequest2 = new PutObjectRequest
  93. {
  94. BucketName = bucketName,
  95. //获取和设置键属性。此键用于标识S3中的对象,上传到s3的路径+文件名,
  96. //S3上没有文件夹可以创建一个,参考https://www.cnblogs.com/web424/p/6840207.html
  97. Key = key,
  98. //所有者获得完全控制权,匿名主体被授予读访问权。如果
  99. //此策略用于对象,它可以从浏览器中读取,无需验证
  100. CannedACL = S3CannedACL.PublicRead,
  101. //上传的文件路径
  102. FilePath = uploadFilePath,
  103. //为对象设置的标记。标记集必须编码为URL查询参数
  104. TagSet = new List<Tag>{
  105. new Tag { Key = "Test", Value = "S3Test"} }
  106. //ContentType = "image/png"
  107. };
  108. putRequest2.Metadata.Add("x-amz-meta-title", "AwsS3Net");
  109. PutObjectResponse response2 = await client.PutObjectAsync(putRequest2);
  110. return true;
  111. }
  112. catch (AmazonS3Exception e)
  113. {
  114. throw new Exception(string.Format("Error encountered ***. Message:'{0}' when writing an object", e.Message));
  115. }
  116. catch (Exception e)
  117. {
  118. throw new Exception(string.Format("Unknown encountered on server. Message:'{0}' when writing an object", e.Message));
  119. }
  120. }
  121. /// <summary>
  122. /// 上传文件 (未经测试)
  123. /// </summary>
  124. /// <param name="inputStream">以流的形式</param>
  125. /// <returns></returns>
  126. public async Task<bool> WritingAnObjectByStreamAsync(Stream inputStream,string filename)
  127. {
  128. string key = string.Format("resource/img/{0}/{1}", _resourceType.ToString().Replace("Img", ""), filename);
  129. try
  130. {
  131. var putRequest1 = new PutObjectRequest
  132. {
  133. BucketName = bucketName,
  134. //创建对象时,要指定键名,它在存储桶中唯一地标识该对象
  135. Key = key,
  136. InputStream= inputStream
  137. };
  138. PutObjectResponse response1 = await client.PutObjectAsync(putRequest1);
  139. return true;
  140. }
  141. catch (AmazonS3Exception e)
  142. {
  143. throw new Exception(string.Format("Error encountered ***. Message:'{0}' when writing an object", e.Message));
  144. }
  145. catch (Exception e)
  146. {
  147. throw new Exception(string.Format("Unknown encountered on server. Message:'{0}' when writing an object", e.Message));
  148. }
  149. }
  150. /// <summary>
  151. /// 删除一个对象
  152. /// </summary>
  153. /// <param name="key">删除的对象的键如:resource/img/basketballnews/test1.jpg</param>
  154. /// <returns></returns>
  155. public async Task<bool> DeleteAnObjectAsync(string key)
  156. {
  157. try
  158. {
  159. // 1. Delete object-specify only key name for the object.
  160. var deleteRequest1 = new DeleteObjectRequest
  161. {
  162. BucketName = bucketName,
  163. Key = key
  164. };
  165. DeleteObjectResponse response1 = await client.DeleteObjectAsync(deleteRequest1);
  166. return true;
  167. }
  168. catch (AmazonS3Exception e)
  169. {
  170. throw new Exception(string.Format("Error encountered ***. Message:'{0}' when writing an object", e.Message));
  171. }
  172. catch (Exception e)
  173. {
  174. throw new Exception(string.Format("Unknown encountered on server. Message:'{0}' when writing an object", e.Message));
  175. }
  176. }
  177. /// <summary>
  178. /// 获取
  179. /// </summary>
  180. /// <param name="prefix">限制对以指定前缀开头的键的响应</param>
  181. /// <returns></returns>
  182. public async Task<List<S3Object>> ListObjectsAsync(string prefix = "")
  183. {
  184. try
  185. {
  186. var list = new ListObjectsRequest
  187. {
  188. BucketName = bucketName,
  189. Prefix = prefix
  190. };
  191. ListObjectsResponse response1 = await client.ListObjectsAsync(list);
  192. return response1.S3Objects;
  193. }
  194. catch (AmazonS3Exception e)
  195. {
  196. throw new Exception(string.Format("Error encountered ***. Message:'{0}' when writing an object", e.Message));
  197. }
  198. catch (Exception e)
  199. {
  200. throw new Exception(string.Format("Unknown encountered on server. Message:'{0}' when writing an object", e.Message));
  201. }
  202. }
  203. }
  204. public enum ResourceType
  205. {
  206. basketballnewsImg,
  207. footballnewsImg,
  208. bannerImg,
  209. videoImg,
  210. logoImg
  211. }
  212. internal class Constants
  213. {
  214. internal const string bucketName = "gfbk";//Write your bucket name
  215. internal const string accessKey = "xxxxxx"; // write your IAM credentials first access key
  216. internal const string secretKey = "xxxxxx"; // write your IAM credentials second access key(secret key)
  217. }
  218. }

 

   如下所示:

 

  参考文献: 

    https://aws.amazon.com/cn/developer/language/net/code-samples/net-code-samples/
    https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/UploadObjSingleOpNET.html

 

posted on
2019-08-08 20:04 花阴偷移 阅读() 评论() 编辑 收藏

版权声明:本文为MrHSR原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/MrHSR/p/11323429.html