当前位置: 首页 > news >正文

.NET CORE Aws S3 使用

1.安装指定的包

 Install-Package AWSSDK.S3 -Version 3.3.104.10

2.使用帮助类

using System;
using System.Collections.Generic;
using System.Text;
using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using System.IO;
using System.Threading.Tasks;namespace xx.xx.xx.Helper
{public class AwsS3Helper{/// <summary>/// 地区是亚太香港/// </summary>readonly RegionEndpoint bucketRegion = RegionEndpoint.GetBySystemName("xx");/// <summary>/// 要向 Amazon S3 上传数据(照片、视频、文档等),/// 您必须首先在其中一个 AWS 区域中创建 S3 存储桶, 比如:在亚太香港地址,创建了一个gfbk桶/// 然后,您可以将任何数量的对象上传到该存储桶。/// 每个 AWS 账户中创建多达 100 个存储桶,一个存储桶中可以存储任意数量的对象。/// 资料:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/UsingBucket.html/// </summary>readonly string bucketName = Appsettings.GetNode("AwsBucketName");/// <summary>/// 请求S3的凭据/// </summary>readonly AWSCredentials awsCredentials = new BasicAWSCredentials(Appsettings.GetNode("AwsAccessKey"), Appsettings.GetNode("AwsSecretKey"));/// <summary>/// 请求客户端/// </summary>AmazonS3Client client = null;/// <summary>/// 上传资源类型/// </summary>ResourceType _resourceType;public AwsS3Helper(ResourceType resourceType){_resourceType = resourceType;client = new AmazonS3Client(awsCredentials, bucketRegion);}/// <summary>///创建一个桶/// </summary>/// <returns></returns>public async Task CreateBucket(){var putBucketRequest = new PutBucketRequest{BucketName = bucketName,UseClientRegion = true};PutBucketResponse putBucketResponse = await client.PutBucketAsync(putBucketRequest);string bucketLocation = await FindBucketLocationAsync(client);}/// <summary>/// 查找桶所在的地区/// </summary>/// <param name="client"></param>/// <returns></returns>private async Task<string> FindBucketLocationAsync(IAmazonS3 client){string bucketLocation;var request = new GetBucketLocationRequest(){BucketName = bucketName};GetBucketLocationResponse response = await client.GetBucketLocationAsync(request);bucketLocation = response.Location.ToString();return bucketLocation;}/// <summary>/// 上传文件/// </summary>/// <param name="uploadFilePath">上传的文件地址如:E:\test.jpg</param>/// <returns></returns>public async Task<bool> WritingAnObjectAsync(string uploadFilePath){try{string filename = uploadFilePath.Substring(uploadFilePath.LastIndexOf('\\') + 1);string key = string.Format("resource/img/{0}/{1}", _resourceType.ToString().Replace("Img", ""), filename);var putRequest2 = new PutObjectRequest{BucketName = bucketName,//获取和设置键属性。此键用于标识S3中的对象,上传到s3的路径+文件名,//S3上没有文件夹可以创建一个,参考https://www.cnblogs.com/web424/p/6840207.htmlKey = key,//所有者获得完全控制权,匿名主体被授予读访问权。如果//此策略用于对象,它可以从浏览器中读取,无需验证CannedACL = S3CannedACL.PublicRead,//上传的文件路径FilePath = uploadFilePath,//为对象设置的标记。标记集必须编码为URL查询参数TagSet = new List<Tag>{new Tag { Key = "Test", Value = "S3Test"} }//ContentType = "image/png"};putRequest2.Metadata.Add("x-amz-meta-title", "AwsS3Net");PutObjectResponse response2 = await client.PutObjectAsync(putRequest2);return true;}catch (AmazonS3Exception e){throw new Exception(string.Format("Error encountered ***. Message:'{0}' when writing an object", e.Message));}catch (Exception e){throw new Exception(string.Format("Unknown encountered on server. Message:'{0}' when writing an object", e.Message));}}/// <summary>/// 上传文件 (未经测试)/// </summary>/// <param name="inputStream">以流的形式</param>/// <returns></returns>public async Task<bool> WritingAnObjectByStreamAsync(Stream inputStream, string key, string contenttype){//string key = string.Format("resource/img/{0}/{1}", _resourceType.ToString().Replace("Img", ""), filename);try{var putRequest1 = new PutObjectRequest{BucketName = bucketName,//创建对象时,要指定键名,它在存储桶中唯一地标识该对象Key = key,CannedACL = S3CannedACL.PublicRead,//放开存储InputStream = inputStream,ContentType = contenttype};PutObjectResponse response1 = await client.PutObjectAsync(putRequest1);return true;}catch (AmazonS3Exception e){throw new Exception(string.Format("Error encountered ***. Message:'{0}' when writing an object", e.Message));}catch (Exception e){throw new Exception(string.Format("Unknown encountered on server. Message:'{0}' when writing an object", e.Message));}}/// <summary>/// 删除一个对象/// </summary>/// <param name="key">删除的对象的键如:resource/img/basketballnews/test1.jpg</param>/// <returns></returns>public async Task<bool> DeleteAnObjectAsync(string key){try{// 1. Delete object-specify only key name for the object.var deleteRequest1 = new DeleteObjectRequest{BucketName = bucketName,Key = key};DeleteObjectResponse response1 = await client.DeleteObjectAsync(deleteRequest1);return true;}catch (AmazonS3Exception e){throw new Exception(string.Format("Error encountered ***. Message:'{0}' when writing an object", e.Message));}catch (Exception e){throw new Exception(string.Format("Unknown encountered on server. Message:'{0}' when writing an object", e.Message));}}/// <summary>/// 获取/// </summary>/// <param name="prefix">限制对以指定前缀开头的键的响应</param>/// <returns></returns>public async Task<List<S3Object>> ListObjectsAsync(string prefix = ""){try{var list = new ListObjectsRequest{BucketName = bucketName,Prefix = prefix};ListObjectsResponse response1 = await client.ListObjectsAsync(list);return response1.S3Objects;}catch (AmazonS3Exception e){throw new Exception(string.Format("Error encountered ***. Message:'{0}' when writing an object", e.Message));}catch (Exception e){throw new Exception(string.Format("Unknown encountered on server. Message:'{0}' when writing an object", e.Message));}}}public enum ResourceType{xx,xx,xx,xx,xx,xx,xx,xx}
}

3.接口请求

 [HttpPost][Route("uploadfils")]public async Task<ActionResult<Result>> UploadFiles(List<IFormFile> files, [FromQuery] int type, string filetype){var rtype = new ResourceType();AwsS3Helper awss3 = new AwsS3Helper(rtype);try{if (files == null && files.Count == 0){return ApiResultHelper.renderError("未选择上传的文件!");}foreach (var file in files){if (file.Length > 0){using (var stream = file.OpenReadStream()){var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');//拼接地址string key = string.Format("resource/{0}/{1}/{2}", filetype, "xx", fileName);var result = await awss3.WritingAnObjectByStreamAsync(stream, key, file.ContentType);}}}return ApiResultHelper.renderSuccess();}catch (Exception e){return ApiResultHelper.renderError();}}/// <summary>/// 删除aws s3数据/// </summary>/// <param name="key"></param>/// <returns></returns>[HttpPost][Route("deletefiles")]public async Task<ActionResult<Result>> DeleteFiles(string key){var rtype = new ResourceType();AwsS3Helper awss3 = new AwsS3Helper(rtype);try{if (!string.IsNullOrEmpty(key)){var result = await awss3.DeleteAnObjectAsync(key);if (result){return ApiResultHelper.renderSuccess(true);}}return ApiResultHelper.renderError();}catch (Exception e){return ApiResultHelper.renderError();}}

相关文章:

  • 前端面试题 ===> 【Ajax、请求】
  • C# 中多线程锁的使用经验
  • VMwareWorkstation16与Ubuntu 18.04.6 LTS下载与安装
  • Python的基础操作
  • 华为OD应聘感受
  • GUROBI之数学启发式算法Matheuristics
  • Python中的区块链技术与应用
  • Linux 网络套接字编程基础
  • 人工智能在未来的优势
  • SpringBoot使用log4j2将日志记录到文件及自定义数据库
  • Django快速入门
  • Kafka 技术指南:使用、特性、一致性保证与 Golang 中间件应用(下)
  • 【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)
  • 【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二:Fast R-CNN图文详解
  • 走进网络世界 了解一些基础知识
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • github指令
  • If…else
  • Redis学习笔记 - pipline(流水线、管道)
  • vuex 学习笔记 01
  • 给Prometheus造假数据的方法
  • 经典排序算法及其 Java 实现
  • 树莓派 - 使用须知
  • 我感觉这是史上最牛的防sql注入方法类
  • 学习笔记TF060:图像语音结合,看图说话
  • 在Unity中实现一个简单的消息管理器
  • postgresql行列转换函数
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 计算机视觉入门
  • (12)目标检测_SSD基于pytorch搭建代码
  • (4) PIVOT 和 UPIVOT 的使用
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (九)信息融合方式简介
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)ABI是什么
  • (转)IOS中获取各种文件的目录路径的方法
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • *p++,*(p++),*++p,(*p)++区别?
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net连接MySQL的方法
  • .NET学习全景图
  • @DataRedisTest测试redis从未如此丝滑
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [20150321]索引空块的问题.txt
  • [CISCN2019 华东南赛区]Web4
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)
  • [codevs 2822] 爱在心中 【tarjan 算法】