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
- {
- ///
- /// 地区是亚太香港
- ///
- readonly RegionEndpoint bucketRegion = RegionEndpoint.GetBySystemName("xx");
-
-
- ///
- /// 要向 Amazon S3 上传数据(照片、视频、文档等),
- /// 您必须首先在其中一个 AWS 区域中创建 S3 存储桶, 比如:在亚太香港地址,创建了一个gfbk桶
- /// 然后,您可以将任何数量的对象上传到该存储桶。
- /// 每个 AWS 账户中创建多达 100 个存储桶,一个存储桶中可以存储任意数量的对象。
- /// 资料:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/UsingBucket.html
- ///
- readonly string bucketName = Appsettings.GetNode("AwsBucketName");
-
-
- ///
- /// 请求S3的凭据
- ///
- readonly AWSCredentials awsCredentials = new BasicAWSCredentials(Appsettings.GetNode("AwsAccessKey"), Appsettings.GetNode("AwsSecretKey"));
-
-
- ///
- /// 请求客户端
- ///
- AmazonS3Client client = null;
-
-
- ///
- /// 上传资源类型
- ///
- ResourceType _resourceType;
-
- public AwsS3Helper(ResourceType resourceType)
- {
- _resourceType = resourceType;
- client = new AmazonS3Client(awsCredentials, bucketRegion);
- }
-
-
- ///
- ///创建一个桶
- ///
- ///
- public async Task CreateBucket()
- {
- var putBucketRequest = new PutBucketRequest
- {
- BucketName = bucketName,
- UseClientRegion = true
- };
- PutBucketResponse putBucketResponse = await client.PutBucketAsync(putBucketRequest);
- string bucketLocation = await FindBucketLocationAsync(client);
- }
-
-
- ///
- /// 查找桶所在的地区
- ///
- ///
- ///
- 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;
- }
-
-
-
- ///
- /// 上传文件
- ///
- /// 上传的文件地址如:E:\test.jpg
- ///
- 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
{ - 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));
- }
- }
-
-
-
- ///
- /// 上传文件 (未经测试)
- ///
- /// 以流的形式
- ///
- 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));
- }
- }
-
-
- ///
- /// 删除一个对象
- ///
- /// 删除的对象的键如:resource/img/basketballnews/test1.jpg
- ///
- 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));
- }
- }
-
-
- ///
- /// 获取
- ///
- /// 限制对以指定前缀开头的键的响应
- ///
- public async Task
> 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
> UploadFiles(List 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();
- }
- }
- ///
- /// 删除aws s3数据
- ///
- ///
- ///
- [HttpPost]
- [Route("deletefiles")]
- public async Task
> 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();
- }
- }