第一次写博客,如有错误请多多指教。

先上代码吧:

 ossUpload = function (file, fun, funParameter) {
//第一此请求后台服务器获取认证请求
$.ajax({
url: "/UEditor/GetSecurityToken",
type: "post",
success: function (data) {
var access = JSON.parse(data);
console.log(access);
let host = access.Host;
var myDate = new Date().format("yyyyMMddhhmmss");
var policyBase64 = Base64.encode(JSON.stringify(myDate))
var name = Base64.encode(JSON.stringify(myDate))
var name = Crypto.HMAC(Crypto.SHA1, policyBase64, name);
var g_object_name = access.Object_name + "/" + name+"."+file.type.split('/')[1]
var request = new FormData();
request.append('id', "file_0");
request.append("OSSAccessKeyId", access.AccessKeyId); //Bucket 拥有者的Access Key Id。
request.append("policy", access.Policy); //policy规定了请求的表单域的合法性
request.append("Signature", access.Signature); //根据Access Key Secret和policy计算的签名信息,OSS验证该签名信息从而验证该Post请求的合法性
request.append('x-oss-security-token', access.SecurityToken);
//---以上都是阿里的认证策略
request.append("key", g_object_name); //文件名字,可设置路径
request.append("success_action_status", '200'); // 让服务端返回200,不然,默认会返回204
request.append('file', file); //需要上传的文件 file
console.log(request);
//正式上传请求
$.ajax({
url: host, //上传阿里地址
data: request,
processData: false, //默认true,设置为 false,不需要进行序列化处理
cache: false, //设置为false将不会从浏览器缓存中加载请求信息
async: false, //发送同步请求
contentType: false, //避免服务器不能正常解析文件---------具体的可以查下这些参数的含义
dataType: 'xml', //不涉及跨域 写json即可
type: 'post',
success: fun(funParameter, host, g_object_name),
error: function (returndata) {
console.log(arguments)
alert("上传图片出错", false);
}
});
}
})
}
//格式化时间
Date.prototype.format = function (fmt) {
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for (var k in o) {
if (new RegExp("(" + k + ")").test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
}
}
return fmt;
}

上传用的是sts上传还需要在阿里云进行一系列的授权管理,最后得到AccessKeyId,AccessKeySecret用来请求已经授权的角色(RoleArn)当然还需要REGIONID(地区对应ID 例:cn-beijing),ENDPOINT(请求接口 例:sts.cn-beijing.aliyuncs.com)

这一步sts请求是在后台进行的我后台用的是.net core,还需要引用aliyun-net-sdk-sts上一份后端的代码

  public class AliyunAcsStsConfig
{
/// <summary>
/// 地区
/// </summary>
public string REGIONID { get; set; }
/// <summary>
/// 访问阿里云的地址
/// </summary>
public string ENDPOINT { get; set; }
/// <summary>
/// 配置的ram
/// </summary>
public string RoleArn { get; set; }
/// <summary>
/// 会话的名称可自定义
/// </summary>
public string RoleSessionName { get; set; }
/// <summary>
/// 该权限用户的密码
/// </summary>
public string AccessKeySecret { get; set; }
/// <summary>
/// 该权限的用户ID
/// </summary>
public string AccessKeyId { get; set; }
/// <summary>
/// 上传路径
/// https://Bucket名称.oss-cn-beijing.aliyuncs.com
/// </summary>
public string upload { get; set; }
/// <summary>
/// 文件存储路径
/// ***/****/
/// </summary>
public string path { get; set; }
}

private readonly UEditorService _ueditorService;
private readonly AliyunAcsStsConfig stsConfig;
public UEditorController(UEditorService ueditorService, IOptions<AliyunAcsStsConfig> stsConfig)
{
this._ueditorService = ueditorService;
this.stsConfig = stsConfig.Value;
}
 string REGIONID = stsConfig.REGIONID;
string ENDPOINT = stsConfig.ENDPOINT;
// 构建一个 Aliyun Client, 用于发起请求
// 构建Aliyun Client时需要设置AccessKeyId和AccessKeySevcret
DefaultProfile.AddEndpoint(REGIONID, REGIONID, "Sts", ENDPOINT);
IClientProfile profile = DefaultProfile.GetProfile(REGIONID, stsConfig.AccessKeyId, stsConfig.AccessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
// 构造AssumeRole请求
AssumeRoleRequest request = new AssumeRoleRequest();
request.AcceptFormat = FormatType.JSON;
// 指定角色Arn
request.RoleArn = stsConfig.RoleArn;
request.RoleSessionName = stsConfig.RoleSessionName;
// 可以设置Token有效期,可选参数,默认3600秒;
// request.DurationSeconds = 3600;
// 可以设置Token的附加Policy,可以在获取Token时,通过额外设置一个Policy进一步减小Token的权限;
// request.Policy="<policy-content>"
String dt = DateTime.Now.AddMinutes(5).ToString("yyyy-MM-ddTHH:mm:ss.000Z");
object[,] ob = { { "content-length-range", 0, 1048576000 } };
AssumeRoleResponse response = client.GetAcsResponse(request);
ImgUploadAccess access = new ImgUploadAccess();
access.AccessKeyId = response.Credentials.AccessKeyId;
access.AccessKeySecret = response.Credentials.AccessKeySecret;
access.SecurityToken = response.Credentials.SecurityToken;
string str = JsonConvert.SerializeObject(new Policy
{
expiration=dt,
conditions=ob
});
byte[] b = Encoding.Default.GetBytes(str);
string base64 = Convert.ToBase64String(b);
HMACSHA1 hmacsha1 = new HMACSHA1();
hmacsha1.Key= Encoding.UTF8.GetBytes(access.AccessKeySecret);
byte[] hashBytes = hmacsha1.ComputeHash(Encoding.UTF8.GetBytes(base64));
access.Policy = base64;
access.Signature =Convert.ToBase64String(hashBytes);
access.Object_name = stsConfig.path+DateTime.Now.ToString("yyyyMM");
access.Host = stsConfig.imgupload;
return JsonConvert.SerializeObject(access);
   public class ImgUploadAccess
{
public string AccessKeyId { get; set; }
public string AccessKeySecret { get; set; }
public string SecurityToken { get; set; }
public string Host { get; set; }
public string Signature { get; set; }
public string Policy { get; set; }
public string Object_name { get; set; }
}
public class Policy
{
public string expiration { get; set; }
public object[,] conditions { get; set; }
}

这样上传功能基本上搞定了

阿里OSS前端直传的更多相关文章

  1. vue 上传图片到阿里云(前端直传:不推荐)

    为何要这样做:减轻后端数据库压力(个人觉得于前端没啥用,谁返回来都行) 代码部分: <template> <div class="upLoad"> < ...

  2. VUE-利用OSS BrowserJS-SDK实现阿里OSS前端上传

    项目中遇到利用阿里OSS上传文件,线上很多示例用到了各种SDK,却没有看到OSS BrowserJS-SDK相关示例,鉴于脑子不好使,记一下. 封装upload相关组件  使用npm安装SDK的开发 ...

  3. 微信公众号通过图片选取接口上传到阿里oss

    前言 之前写过一篇微信JS-SDK的使用方法,可进行参考 https://www.cnblogs.com/fozero/p/10256862.html 配置并调用公众号接口权限 1.配置权限微信公众号 ...

  4. 阿里无线前端性能优化指南 (Pt.1 加载优化)

    前言 阿里无线前端团队在过去一年对所负责业务进行了全面的性能优化.以下是我们根据实际经验总结的优化指南,希望对大家有所帮助. 第一部分仅包括数据加载期优化. 图片控制 对于网页特别是电商类页面来说,图 ...

  5. IT职场经纬 |阿里web前端面试考题,你能答出来几个?

    有很多小伙伴们特别关心面试Web前端开发工程师时,面试官都会问哪些问题.今天小卓把收集来的"阿里Web前端开发面试题"整理贴出来分享给大家伙看看,赶紧收藏起来做准备吧~~ 一.CS ...

  6. 阿里妈妈前端团队出品的开源接口管理工具RAP第二代 http://rap2.taobao.org

    RAP2-DELOS 开源社区版本 (后端API服务器) 项目地址:https://github.com/thx/rap2-delos RAP2是在RAP1基础上重做的新项目,它包含两个组件(对应两个 ...

  7. ThinkPHP 提供Auth 权限管理、支付宝、微信支付、阿里oss、友盟推送、融云即时通讯、云通讯短信、Email、Excel、PDF 等等

    多功能 THinkPHP 开源框架 项目简介:使用 THinkPHP 开发项目的过程中把一些常用的功能或者第三方 sdk 整合好,开源供亲们参考,如 Auth 权限管理.支付宝.微信支付.阿里oss. ...

  8. 阿里P7前端需要哪些技能

    原谅我copy过来的,但是这个条理很清楚很有借鉴意义 前言 以下是从公众号的文章中获取到的一位阿里的前端架构师整理的前端架构p7的技能图谱,当然不是最完整.最系统的,所以之后我会一直维护更新这里的内容 ...

  9. 小程序--->小程序图片上传阿里OSS使用方法

    小程序图片上传阿里OSS使用方法 首先看下参考文档 ( http://blog.csdn.net/qq_38125123/article/details/73870667) 这里只将一些运用过程中遇到 ...

随机推荐

  1. OC-RunLoop运行循环

    RunLoop--运行循环 作用:死循环,保证程序不退出:监听事件 (所有事件都是有它监听的):等待用户的交互: 特性: ios中所有的事件监听全部由运行循环负责: 主线程的RunLoop在应用启动的 ...

  2. 使用python实现后台系统的JWT认证

    介绍 JWT协议似乎已经应用十分广泛,JSON Web Token--一种基于token的json格式web认证方法.基本的原理是,第一次认证通过用户名密码,服务端签发一个json格式的token.后 ...

  3. centos7 安装gitlab及简单配置

    1.安装 wget -O gitlab.rpm https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-11.11.3 ...

  4. Java同步和异步,阻塞和非阻塞

    同步和异步.阻塞和非阻塞 同步和异步关注的是消息通信机制. 同步是指: 发送方发出数据后, 等待接收方发回响应后才发下一个数据包的通讯方式. 就是在发出一个调用时, 在没有得到结果之前, 该调用就不返 ...

  5. error: exportArchive: The data couldn’t be read because it isn’t in the correct format.

    在执行ios 打包的时候,我们通过执行下面的指令来打包ipa: mkdir arch archive_path=arch/${app_name}.xcarchive workspace_name=HP ...

  6. EditPlus常用正则表达式

    正则表达式(Regular Expression,在代码中常简写为regex.regexp或RE)是计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本 ...

  7. 201971010131-张兴盼《面向对象程序设计(java)》第十二周学习总结

      内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...

  8. window.open()与window.showModuleDialog()

    一.window.showModalDialog()     模态对话框. (只支持IE浏览器)window.showModelessDialog()   非模态对话框. 基本语法:vReturnVa ...

  9. 【Excel】截取字符 LEFT(A1,2) RIGHT(A1,2) MID(SHEET1!E2,1,9)

    LEFT(A1,2)从左边取两个字符 RIGHT(A1,2)从右边取两个字符 MID(SHEET1!E2,1,9)从sheet1表E2单元格中第一位起后9位 可以嵌套

  10. Scrapy框架详解

    Python网络爬虫Scrapy框架研究 Scrapy1.0教程 Scrapy笔记(1)- 入门篇 Scrapy笔记(2)- 完整示例 Scrapy笔记(3)- Spider详解 Scrapy笔记(4 ...