asp.net core系列 69 Amazon S3 资源文件上传示例

时间:2019-09-04 10:02 作者:Mr.Pan 阅读数:529


一.  上传示例

  Amazon Simple Storage Service 是互联网存储解决方案。该服务旨在降低开发人员进行网络规模级计算的难度。

  Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据。此服务让所有开发人员都能访问同一个具备高扩展性、可靠性、安全性和快速价廉的数据存储基础设施, Amazon 用它来运行其全球的网站网络。此服务旨在为开发人员带来最大化的规模效益。

  Install-Package AWSSDK.S3 -Version 3.3.104.10

复制代码

using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
/*
     //上传篮球资料图片
     AwsS3Helper s3 = new AwsS3Helper(ResourceType.basketballnewsImg);
     s3.WritingAnObjectAsync("E:\\11\\test1.jpg").Wait();    
 */
namespace AwsS3WithNetCore
{
    /// <summary>
    ///Amazon S3 上传数据(照片、视频、文档等) 
    /// </summary>
    public class AwsS3Helper
    {
        /// <summary>
        /// 地区是亚太香港
        /// </summary>
        readonly RegionEndpoint bucketRegion = RegionEndpoint.GetBySystemName("ap-east-1");

        /// <summary>
        /// 要向 Amazon S3 上传数据(照片、视频、文档等),
        /// 您必须首先在其中一个 AWS 区域中创建 S3 存储桶, 比如:在亚太香港地址,创建了一个gfbk桶
        /// 然后,您可以将任何数量的对象上传到该存储桶。
        /// 每个 AWS 账户中创建多达 100 个存储桶,一个存储桶中可以存储任意数量的对象。
        /// 资料:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/UsingBucket.html
        /// </summary>
        readonly string bucketName = Constants.bucketName;

        /// <summary>
        /// 请求S3的凭据
        /// </summary>
        readonly AWSCredentials awsCredentials = new BasicAWSCredentials(Constants.accessKey, Constants.secretKey);

        /// <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 filename)
        {
            string key = string.Format("resource/img/{0}/{1}", _resourceType.ToString().Replace("Img", ""), filename);
            try
            {
                var putRequest1 = new PutObjectRequest
                {
                    BucketName = bucketName,
                    //创建对象时,要指定键名,它在存储桶中唯一地标识该对象
                    Key = key,
                    InputStream= inputStream
                };
                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
    {
        basketballnewsImg,
        footballnewsImg,
        bannerImg,
        videoImg,
        logoImg
    }
    internal class Constants
    {
        internal const string bucketName = "gfbk";//Write your bucket name
        internal const string accessKey = "xxxxxx"; // write your IAM credentials first access key
        internal const string secretKey = "xxxxxx"; // write your IAM credentials second access key(secret key)
    }
}

复制代码

 

   如下所示:

 

  参考文献: 

    https://aws.amazon.com/cn/developer/language/net/code-samples/net-code-samples/
    https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/UploadObjSingleOpNET.html

文章转自:https://www.cnblogs.com/MrHSR/p/11323429.html


推荐文章

[推荐] .NET Core 学习资料精选:入门

[推荐] 数据库常见死锁原因及处理

[推荐] C# 设置Excel数据自适应行高、列宽的2种情况 (转)

[推荐] C++ vector 和set结合数字去重练习

[推荐] win7 .net core 部署 The library hostfxr.dll was found, but loading it from C:\<path_to_app>\hostfxr.dll failed

[推荐] JdbcTemplate多数据源使用

[推荐] 深入学习Redis(2):持久化

[推荐] asp.net core系列 67 Web压力测试工具WCAT

[推荐] .Net Core 2.0 获取客户端IP地址

[推荐] 第七天 让你的container实现跨主机访问

[推荐] 8天玩转并行开发——第八天 用VS性能向导解剖你的程序

[推荐] nodejs app.use(express.static) 静态文件托管 (四)

[推荐] C++ 稀疏表的练习

[推荐] asp.net core系列 33 EF查询数据 (2)

[推荐] C++ Lambda表达式练习

[推荐] Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践

[推荐] 试试发布

[推荐] C++中 *p++ 到底是 *(p++) 还是 (*p)++ 1. 猜想

[推荐] JavaWeb-Log4j: WARN No appenders could be found for logger

[推荐] C++ 模板练习


评论列表



注册用户登录后才能发表评论,请登录注册,访问 博客首页