阿里云OSS-web直传---在服务端c#签名,浏览器直传
web直传的好处:用户通过浏览器直接上传到阿里云OSS,对web服务器没有压力!
这里的服务端代码仅仅用来计算签名,不处理上传!如果.net服务端直传(支持分片和断点续传),参考OSS .NET SDK(https://help.aliyun.com/document_detail/32090.html)
WEB端表单上传,需要签名域Signature,通过js计算签名,AccessKeyID和AcessKeySecret会暴露在前端页面,严重安全隐患,因此用服务端计算签名再返回给浏览器,浏览器通过表单(multipart/form-data 编码)的方式就可以直接上传文件到OSS了,
阿里官网文档https://help.aliyun.com/document_detail/31926.html (Java,Python,PHP,Go,Ruby签名示例)没有提供C#版本的签名计算代码,这里提供一个供参考
PostObject API参考: https://help.aliyun.com/document_detail/31988.html
什么是Post Policy?
Post请求的policy表单域用于验证请求的合法性。 policy为一段经过UTF-8和base64编码的JSON文本,声明了Post请求必须满足的条件。
Policy表单域的示例 (JSON格式)
{ "expiration": "2014-12-01T12:00:00.000Z","conditions": [{"bucket": "johnsmith" },["starts-with", "$key", "user/eric/"]]}
注意:Post policy中必须包含expiration和condtions。
什么是Post Signature
Post请求的Signature表单域是根据Policy计算的
计算Signature的具体流程为:
- 创建一个 UTF-8 编码的 policy。
- 将 policy 进行 base64 编码,其值即为 policy 表单域该填入的值,将该值作为将要签名的字符串。
- 使用 AccessKeySecret 对要签名的字符串进行签名。
C#签名代码(MVC)
前提:需要安装aliyun.oss.sdk和Newtonsoft.Json的nuget包
public class AliyunController : MyControllerBase
{
public string accessKeyId = System.Configuration.ConfigurationManager.AppSettings["aliyun_ak_id"];//请填写您的AccessKeyId。
public string accessKeySecret = System.Configuration.ConfigurationManager.AppSettings["aliyun_ak_secret"];//请填写您的AccessKeySecret
public string bucket = System.Configuration.ConfigurationManager.AppSettings["aliyun_bucket"];//请填写您的bucket name
// GET: Aliyun
public ContentResult GetPostObjectSignature(int courseId)
{
string host = "http://"+ bucket + ".oss-cn-shanghai.aliyuncs.com";//请填写您的bucket endpoint。 const string endpoint = "http://oss-cn-shanghai.aliyuncs.com";//请填写您的endpoint //第一步,构造policy
var dir = "zhangsan/";//设置当前用户上传指定的前缀,必须以斜线结尾,类似目录(OSS不存在多级目录,但是可以模拟)
var expiration = DateTime.Now.AddMinutes();
var policyConds = new PolicyConditions();
policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir);//上传目录
policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, , );//允许上传的文件大小限制
var ossClient = new OssClient(endpoint, accessKeyId, accessKeySecret);//调用阿里云SDK的API
var postPolicy = ossClient.GeneratePostPolicy(expiration, policyConds);//给policyConds添加过期时间并json序列化(格式iso8601:"yyyy-MM-dd'T'HH:mm:ss.fff'Z'")
/*生成的Policy范例
{"expiration":"2017-05-17T20:23:23Z","conditions":[["content-length-range",0,1048576000],["starts-with","$key","zhangsan"]]}
*/
//第二步 将policy 的json字符串进行base64编码
var base64Policy = Convert.ToBase64String(Encoding.UTF8.GetBytes(postPolicy));
//第三步,生成签名(哈希算法)
var signature = ComputeSignature(accessKeySecret, base64Policy);//生成签名
//以下返回给前端表单域或者阿里云OSS的js api
TimeSpan ts = expiration - new DateTime(, , , , , , );
var expire = Convert.ToInt64(ts.TotalSeconds);
Dictionary<string, object> response_dic = new Dictionary<string, object>();
response_dic["accessid"] = accessKeyId;
response_dic["host"] = host;
response_dic["policy"] = base64Policy;
response_dic["signature"] = signature;
response_dic["expire"] = expire;
//这个参数是设置用户上传指定的前缀
response_dic["dir"] = dir;
return Content(JsonConvert.SerializeObject(response_dic));
}
private string ComputeSignature(string key, string data)
{
using (var algorithm = KeyedHashAlgorithm.Create("HmacSHA1".ToUpperInvariant()))
{
algorithm.Key = Encoding.UTF8.GetBytes(key.ToCharArray());
return Convert.ToBase64String(
algorithm.ComputeHash(Encoding.UTF8.GetBytes(data.ToCharArray())));
}
}
}
阿里云OSS-web直传---在服务端c#签名,浏览器直传的更多相关文章
- 构建基于阿里云OSS文件上传服务
转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50710132 <构建基于阿里云OSS文件上传服务> <构建基于OS ...
- 记一次阿里云oss文件上传服务假死
引言 记得以前刚开始学习web项目的时候,经常涉及到需要上传图片啥的,那时候都是把图片上传到当前项目文件夹下面,每次项目一重启图片就丢了.虽然可以通过修改/tomcat/conf/server.xml ...
- 阿里云OSS存储前端API上传(签名上传)
一.创建用户 在阿里云创建用户https://ram.console.aliyun.com/users,并勾选Open API 保存好信息,很重要,返回后就再也找不到了 新增授权(这里视个人情况,需要 ...
- 阿里云OSS Web端直传 服务器签名C#版
最近用到队里OSS的文件上传,然后阿里官方给的四个服务器签名有Java PHP Python Go四个版本,就是没C#(话说写个C#有多难?) 百度了一下好像也没有,既然这样只能自己动手照着Java版 ...
- php阿里云oss文件上传
php的文件上传 文件上传 php的文件上传放在了$_FILES数组里,单文件和多文件上传的区别在于$_FILES['userfile']['name']是否为数组, 不熟悉的可以读一下官方文档 单文 ...
- Hexo一键部署到阿里云OSS并设置浏览器缓存
自建博客地址:https://bytelife.net,欢迎访问! 本文为博客自动同步文章,为了更好的阅读体验,建议您移步至我的博客 本文作者: Jeffrey 本文链接: https://bytel ...
- 在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现Web端直传,服务端签名直传并设置上传回调的实现流程
在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现本地文件上传流程 by shuijingwan · 2016/01/13 1.SDK安装 github ...
- 使用阿里云OSS的服务端签名后直传功能
网站一般都会有上传功能,而对象存储服务oss是一个很好的选择.可以快速的搭建起自己的上传文件功能. 该文章以使用阿里云的OSS功能为例,记录如何在客户端使用阿里云的对象存储服务. 服务端签名后直传 背 ...
- angulaijs中的ng-upload-file与阿里云oss服务的结合,实现在浏览器端上传文件到阿里云(速度可以达到1.5M)
2015-10-26 angularjs结合aliyun浏览器端oos文件上传加临时身份验证例子 在服务端获取sts 源码: public class StsServiceSample { // 目前 ...
随机推荐
- centos7系统安装python3,pip3,django
首先去python官网下载python3的源码包,网址:https://www.python.org/ 或者直接wget下载 wget https://www.python.org/ftp/pytho ...
- linux oracle服务器无密码登录dba
1.su - oracle 切换到oracle 2.sqlplus sys/manger as sysdba 3.新建用户: create user username identified by pa ...
- SCI 美国《科学引文索引》(Science Citation Index, 简称 SCI )
科学引文索引 编辑锁定同义词SCI(科学引文索引)一般指科学引文索引 美国<科学引文索引>(Science Citation Index, 简称 SCI )于1957 年由美国科学信息 ...
- OD 实验(八) - 对一个程序的逆向
程序: 运行 弹出 NAG 窗口,提示要花 20 美元注册 然后会进入主窗口 提示剩余 5 天的使用时间 点击,菜单栏 -> Help -> About 显示未注册版本 逆向: 用 OD ...
- win8下ctrl+alt+down失效问题
最近换win8系统后用myeclipse发现这个用得最多快捷键居然不能用了. 百度后的确是显卡的快捷键冲突,但禁用显卡快捷键后仍然无效,把eclipse换成其他的不能忍. 所以把显卡快捷键换了就可以了 ...
- 使用COM口的2、3针的通断作为中端源(有一个读图像的摄像头,当把卡插到位时触发中端,防止在插卡的过程中出现不稳定的图像)
利用串口2读,串口3发数据的特点.建立不断的发送流,再从接收端接收.如果收到,则数据畅通,否则断开.相当于产生一个中断.这样电脑对外部事件可作出反应. using System;using Syste ...
- Spring 中的 LocalSessionFactoryBean和LocalContainerEntityManagerFactoryBean
Spring和Hibernate整合的时候我们经常会有如下的配置代码 1,非JPA支持的配置 <!-- 配置 Hibernate 的 SessionFactory 实例: 通过 Spring 提 ...
- centos 和KVM安装
- Spring cloud Eureka高可用 - 配置
个人项目源码: https://github.com/easonstudy/cloud-demo/tree/master/eureka-peer-server Window 7 修改hosts ht ...
- 一个简单的环境光shader
关于shader的一个简短的历史 在DirectX8之前,GPU有一个固定的方法去变换顶点和像素,称为“固定管线”.这使得在将它们传递给GPU后,开发者不可能操作顶点和像素的变换. DirectX8介 ...