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插件就够了,很少有人去探究上传文件插件到底是怎么做的. 简单列一下我们要做的技术点和功能点 使 ...
随机推荐
- 利用jsonconvert来转换json数据格式 (对象转为json)
今天学了一下.net的WCF组件,边心血来潮,想着现在不都是前后分离,调接口开发不,于是赶紧写了一简单的后台数据,哈哈 废话不多说,直接上代码: 注意需要导入库! 实体类:Customer us ...
- Django rest framework(1)----认证
目录 Django组件库之(一) APIView源码 Django restframework (1) ----认证 Django rest framework(2)----权限 Django ...
- springboot之mybatisplus,mp的简单理解
这是一张简单的service的继承图.可以看到我们的执行类,即XxxServiceImpl的继承关系. 从上到下,ServiceImpl和BaseMapper是一个依赖关系,ServiceImpl和I ...
- while 循环,运算符,字符串的格式化
1.while 关键字 (死循环) while 条件: 循环体 条件:只要条件是 Ture就可以循环. while 空格 条件 冒号 缩进 循环体 while else while 空格 条件 冒号 ...
- 【原】深度学习的一些经验总结和建议 | To do v.s Not To Do
前言:本文同步发布于公众号:Charlotte数据挖掘,欢迎关注,获得最新干货- 昨天看到几篇不同的文章写关于机器学习的to do & not to do,有些观点赞同,有些不赞同,是现在算法 ...
- Excel催化剂开源第33波-Quick Bible For PPT插件项目全代码开源
很感恩,能够在上帝奇妙地带领下,经过多方的资源整合后,可以从我手中完成一款对教会内部制作PPT过程中,引用圣经的这个小环节能够发挥一些小小的作用的小插件.因制作本插件时,也大量用到VSTO开发的一些技 ...
- html+css-->background-img(背景图的设置)
背景图:(相关验证代码请查看代码,在验证时需将当前不需要验证的代码注释掉) 1.inherit:从父元素继承属性设置 2.background-repeat:平铺(在图片大小小于元素尺寸时 ...
- Android拨打电话权限总结
android在6.0和6.0以上拨打电话的权限声明 /** * 打电话 * * @param phoneNumber */ protected void startCallPhone(String ...
- bugku安卓First_Mobile wp
1 打开题目,下载apk 2 将下载好的apk拖进android killer中,提示文件名过长,随便更改一下文件名即可 3 查看入口文件源码(点击android killer工具栏咖啡杯图标) 4 ...
- tomcat用做图片服务器
最近做了个小网站,就是用tinyce富文本编辑器,https://www.511easy.com/ 保持字体排版和图片 发现博客园的图片,一天之后就无法显示 就想着自己做一个图片服务器,上传图片到指定 ...