.NET CORE Aws S3 使用

news/2024/5/19 21:08:31 标签: .netcore, aws, 云计算

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.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.接口请求

 [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();
            }
        }


http://www.niftyadmin.cn/n/5426397.html

相关文章

Android Selinux详解[五]--新增hal服务标签相关

在工作过程中&#xff0c;SElinux常用的有以下几个文件可用于新增标签 可用于加标签的文件名含义对应的声明文件名(一般会声明的地方&#xff0c;根本上放哪里都可以)file_contexts给 文件/目录/节点 新增标签file.tegenfs_contexts给节点新增标签&#xff0c;与上一个不同的是…

Android Studio入门——页面跳转

1.工程目录 2.MainActivity package com.example.demo01;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCo…

【网络安全】手机不幸被远程监控,该如何破解,如何预防?

手机如果不幸被远程监控了&#xff0c;用三招就可以轻松破解&#xff0c;再用三招可以防范于未然。 三招可破解可解除手机被远程监控 1、恢复出厂设置 这一招是手机解决软件故障和系统故障的终极大招。只要点了恢复出厂设置&#xff0c;你手机里后装的各种APP全部将灰飞烟灭…

vector与list的区别与应用?

vector与list的区别与应用&#xff1f;以及怎么找到某vector或者list的倒数第二个元素&#xff1f; vector和list的区别可以类比数组和链表的区别&#xff1a; vector和数组类似&#xff0c;vector是一个在内存中连续存放且可以自动增长的容器&#xff0c;因此支持随机访问&am…

maven打包把所有依赖的jar copy到一个文件夹

在maven项目中&#xff0c;是使用依赖坐标来引入jar包&#xff0c;在引入jar包的时候&#xff0c;maven也会默默的帮助我们导入这个jar包所依赖的jar包。 但是当我们打包项目使用jar包运行的时候&#xff0c;往往会出现缺少jar的情况&#xff1a; 如果我们一个一个添加缺少的…

【符号链接】【bash】遍历目录下的每个子项目

为git_repos目录下的每个项目创建符号链接&#xff08;软链接&#xff09;&#xff0c;需要遍历该目录下的每个子项目&#xff0c;并使用ln -s命令为它们分别创建链接。 1. 创建脚本文件 创建一个文本文件来编写你的脚本。这可以通过任何文本编辑器完成&#xff0c;比如nano…

vim相关命令

vim 三种工作模式&#xff1a;命令模式、文本模式、末行模式 命令模式&#xff1a;通过vi hello.c 命令进入i a o 、I A O、 s S 可以切换到文本模式 &#xff0c;写完后保存退出 o光标 回到下一行O光标回到上一行s删除当前字母S删除一整行A回到该行末尾处a光标回到下一个输入…

vue解析blob数据库类型报错

vue解析blob数据库类型报错 项目场景&#xff1a;问题描述解决总结 项目场景&#xff1a; 项目请求是需要上传文件处理之后还要下载文件的&#xff0c;但是难免报错&#xff0c;报错之后解析的也是blob类型。 问题描述 程序发生问题时&#xff0c;解析不了blob,报错&#xff…