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插件就够了,很少有人去探究上传文件插件到底是怎么做的. 简单列一下我们要做的技术点和功能点 使 ...
随机推荐
- django基础知识之状态保持session:
状态保持 http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态 客户端与服务器端的一次通信,就是一次会话 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据 存储方式包括c ...
- 数字IC前后端设计中的时序收敛(一)前言
本文转自:自己的微信公众号<数字集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 为了纪念,同时 ...
- Oracle数据库---序列、索引、同义词
--创建序列create sequence deptno_seqstart with 50increment by 10maxvalue 70cache 3; --为了方便演示,创建了一个和dept表 ...
- c++学习书籍推荐《深入理解C++11 C++11新特性解析与应用》下载
百度云及其他网盘下载地址:点我 编辑推荐 <深入理解C++11:C++11新特性解析与应用>编辑推荐:C++标准委员会成员和IBM XL编译器中国开发团队共同撰写,权威性毋庸置疑.系统.深 ...
- 剑指offer第二版-总结:排序算法
1.排序算法比较: 2.java实现 快排: /** * 快排 * * @since 2019年2月26日 下午1:37:34 * @author xuchao */ public class Qui ...
- 牛客小白月赛16 E 小雨的矩阵 ( 暴搜)
链接:https://ac.nowcoder.com/acm/contest/949/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 关于使用 AJax 生成Form表单,且表单提交需要验证,验证实效的解决方法
@Ajax.ActionLink("添加", "AddUser",new AjaxOptions() {InsertionMode = InsertionMod ...
- vbox 设置时间不与主机同步
C:\Users\2345-lp0395>"D:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setexadata win ...
- WePY的脱胎换骨
对于前端来说,尤其是开发小程序的前端来说,WePY框架一定不陌生,他是一种小程序开发框架.而且是属于类Vue风格,掌握Vue再来学习WePY学习成本极低. 今天为啥要写这篇文章呢,因为在复习WePY时 ...
- Tiny Counting
也许更好的阅读体验 样例一 输入 4 1 4 3 2 输出 3 样例二 输入 5 9 1 0 0 5 输出 8 题解 这是本人自己想了2个半小时才想出来的方法,稍稍有点复杂但是很好理解 题目的意思就是 ...