.NET CORE Aws S3 使用

1.安装指定的包

Install-Package AWSSDK.S3 -Version 3.3.104.10

2.使用帮助类

cs 复制代码
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.html
                    Key = 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.接口请求

cs 复制代码
 [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();
            }
        }
相关推荐
The Future is mine25 分钟前
在.NET Core控制器中获取AJAX传递的Body参数
c#·.netcore
无味无感11 小时前
ASP.NET Core使用Quartz部署到IIS资源自动被回收解决方案
.netcore
MoFe111 小时前
【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)
java·前端·.netcore
avoidaily13 小时前
使用Node.js分片上传大文件到阿里云OSS
阿里云·node.js·云计算
Elastic 中国社区官方博客17 小时前
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
大数据·人工智能·elasticsearch·搜索引擎·云计算·全文检索·aws
agenIT17 小时前
腾讯云 Python3.12.8 通过yum安装 并设置为默认版本
云计算·腾讯云
Johny_Zhao18 小时前
阿里云数据库Inventory Hint技术分析
linux·mysql·信息安全·云计算·系统运维
容器魔方18 小时前
议程一览 | KubeCon China 2025 华为云精彩前瞻
云原生·容器·云计算
FBI HackerHarry浩18 小时前
云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】
linux·运维·云计算·腾讯云
阿杆21 小时前
大故障,阿里云核心域名疑似被劫持
云计算·阿里巴巴