asp.net core系列 69 Amazon S3 资源文件上传示例
一. 上传示例
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('\\')+);
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
asp.net core系列 69 Amazon S3 资源文件上传示例的更多相关文章
- Asp.net core 学习笔记 ( upload/download files 文件上传与下载 )
更新 : 2018-01-22 之前漏掉了一个 image 优化, 就是 progressive jpg refer : http://techslides.com/demos/progressi ...
- asp.net core 如何集成kindeditor并实现图片上传功能
准备工作 1.visual studio 2015 update3开发环境 2.net core 1.0.1 及以上版本 目录 新建asp.net core web项目 下载kindeditor ...
- 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
一个简单的QQ隐藏图生成算法 隐藏图不是什么新鲜的东西,具体表现在大部分社交软件中,预览图看到的是一张图,而点开后看到的又是另一张图.虽然很早就看到过这类图片,但是一直没有仔细研究过它的原理,今天 ...
- asp.net core系列 40 Web 应用MVC 介绍与详细示例
一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...
- asp.net core系列 39 Web 应用Razor 介绍与详细示例
一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...
- 循序渐进学.Net Core Web Api开发系列【5】:文件上传
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍通 ...
- 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
准备工作: 建立.NET Core Web Api项目 新建一个用于Api请求的UserInfo类 public class UserInfo { public string name { get; ...
- Node开发文件上传系统及向七牛云存储和亚马逊AWS S3的文件上传
背景起,有奏乐: 有伟人曰:学习技能的最好途径莫过于理论与实践相结合. 初学Node这货时,每每读教程必会Fall asleep. 当真要开发系统时,顿觉精神百倍,即便踩坑无数也不失斗志. 因为同团队 ...
- Vue.js 3.0搭配.NET Core写一个牛B的文件上传组件
在开发Web应用程序中,文件上传是经常用到的一个功能. 在Jquery时代,做上传功能,一般找jQuery插件就够了,很少有人去探究上传文件插件到底是怎么做的. 简单列一下我们要做的技术点和功能点 使 ...
随机推荐
- web交互方式---ajax
知识不怕旧,关键在于在旧知识的基础上不断创新与提高! 引入一个问题:打开一个浏览器,在地址栏输入一个网址,按下 enter 键到看到整个页面,中间都经历了哪些事情? 这是一个前端的面试题,相信很多朋友 ...
- Js笛卡尔乘积
self.getDescartesSku = function (selSaleProp, i, nowLst, allALst) { if (selSaleProp.length = ...
- 微服务-springcloud-注册中心
创建服务注册中心(eureka-server) 1.创建项目,选择 Eureka Server 别的都不要选择,next-finish 2.application.yml中写入如下信息:通过eurek ...
- Python题整理
1.Python的多态.鸭子类型? 2.Python的序列化工具有哪些? 3.Python处理Excel的工具有哪些? 4.Python处理Graph的算法库有哪些? 5.Python的dict是基于 ...
- kuangbin专题 专题一 简单搜索 Find a way HDU - 2612
题目链接:https://vjudge.net/problem/HDU-2612 题意:‘@’表示KTV,‘#’表示无法走的地方,‘Y’,'M’表示两个人,他们要在KTV见面,问他们都到达KTV要花费 ...
- Jenkins高级应用——Publish Over SSH插件
在之前的篇幅中有介绍,利用jenkins结合shell脚本完成远程部署的功能,点击Jenkins结合shell+expect脚本完成线上环境自动构建部署即可查看. 上述方式需要引入expect脚本,安 ...
- mysql+mybatis存储超大json
1. 场景描述 因前端界面需存储元素较多,切割后再组装存储的话比较麻烦,就采用大对象直接存储到mysql字段中,根据mysql的介绍可以存放65535个字节,算了算差不多,后来存的时候发现: 一是基本 ...
- android_layout_relativelayout(一)
android的相对布局relativelayout也是一个值得研究的部分.先归纳下最近的几个心得. 相对布局中,xml文件第一个控件总是在屏幕的左上角为它的位置,别管你手机是竖着的还是横着的. 从第 ...
- 洛谷P2790 ccj与zrz之积木问题 题解
题目链接:https://www.luogu.org/problemnew/show/P2790 这题码量稍有点大... 分析: 这道题模拟即可.因为考虑到所有的操作vector可最快捷的实现,所以数 ...
- vue使用问题总结(长期更新)
循环中绑定标签的属性 <div class="imgdiv" v-for="template of templateArr"> <img :s ...