• .NET CORE Aws S3 使用


    1.安装指定的包

     Install-Package AWSSDK.S3 -Version 3.3.104.10

    2.使用帮助类

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

    3.接口请求

    1. [HttpPost]
    2. [Route("uploadfils")]
    3. public async Task> UploadFiles(List files, [FromQuery] int type, string filetype)
    4. {
    5. var rtype = new ResourceType();
    6. AwsS3Helper awss3 = new AwsS3Helper(rtype);
    7. try
    8. {
    9. if (files == null && files.Count == 0)
    10. {
    11. return ApiResultHelper.renderError("未选择上传的文件!");
    12. }
    13. foreach (var file in files)
    14. {
    15. if (file.Length > 0)
    16. {
    17. using (var stream = file.OpenReadStream())
    18. {
    19. var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
    20. //拼接地址
    21. string key = string.Format("resource/{0}/{1}/{2}", filetype, "xx", fileName);
    22. var result = await awss3.WritingAnObjectByStreamAsync(stream, key, file.ContentType);
    23. }
    24. }
    25. }
    26. return ApiResultHelper.renderSuccess();
    27. }
    28. catch (Exception e)
    29. {
    30. return ApiResultHelper.renderError();
    31. }
    32. }
    33. ///
    34. /// 删除aws s3数据
    35. ///
    36. ///
    37. ///
    38. [HttpPost]
    39. [Route("deletefiles")]
    40. public async Task> DeleteFiles(string key)
    41. {
    42. var rtype = new ResourceType();
    43. AwsS3Helper awss3 = new AwsS3Helper(rtype);
    44. try
    45. {
    46. if (!string.IsNullOrEmpty(key))
    47. {
    48. var result = await awss3.DeleteAnObjectAsync(key);
    49. if (result)
    50. {
    51. return ApiResultHelper.renderSuccess(true);
    52. }
    53. }
    54. return ApiResultHelper.renderError();
    55. }
    56. catch (Exception e)
    57. {
    58. return ApiResultHelper.renderError();
    59. }
    60. }

  • 相关阅读:
    js如何显示input输入的文字的个数
    Yunfly 一款高效、性能优异的 node.js web 框架
    Loguru:Python中强大的日志库
    python绘制3D图表
    跟我读CVPR 2022论文:基于场景文字知识挖掘的细粒度图像识别算法
    UNet详细解读(二)pytorch从头开始搭建UNet
    力扣2596
    仓储业如何减低成本
    [java刷算法]牛客—剑指offer树的子结构,对称树,树的镜像
    跨域问题总结
  • 原文地址:https://blog.csdn.net/qq_36694046/article/details/136672057