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

先上代码吧:

 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. 通过jQuery给<li>绑定点击事件

    背景:有个需求需要js中实现li标签的事件绑定,li通过在ajax请求中动态添加,按照常理,使用jQuery,可以使用以下方法绑定点击事件: $(function(){  commonAjaxCall ...

  2. Mongodb基础 学习小结

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能 ...

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

    项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/ ...

  4. 69.x的平方根 (平)(简单)

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4输出: 2示例 2: ...

  5. day14_7.16 模块

    一.模块 1.什么是模块? 模块就是一系列功能的结合体. 模块的三种来源: 1.内置的,也就是python解释器自带的,可以直接导入 2.第三方的,需要下载的 3.自定义的,自己写的模块 模块的四种表 ...

  6. 【Spring IoC】依赖注入DI(四)

    平常的Java开发中,程序员在某个类中需要依赖其它类的方法.通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由程 ...

  7. zz深度学习在美团配送 ETA 预估中的探索与实践

    深度学习在美团配送 ETA 预估中的探索与实践 比前一版本有改进:   基泽 周越 显杰 阅读数:32952019 年 4 月 20 日   1. 背景 ETA(Estimated Time of A ...

  8. Sublime Text 3安装GoSublime

      GoLand IDE工具虽然在编程时很好用,但是在使用中也有个问题,有时我们可能只是写一个简单的脚本来测试,对于我而言在打开IDE太重量级了,所以捣鼓了GoSublime工具来满足平时最基本的需求 ...

  9. function函数——函数的定义及参数

    #_*_coding:utf-8_*_#作者:王佃元#日期:2019/12/21#函数function subrouting \ procedure#函数的意义 # 1.减少代码重复 # 2.更易扩展 ...

  10. Codeforces Round #545 (Div. 2) E 强连通块 + dag上求最大路径 + 将状态看成点建图

    https://codeforces.com/contest/1138/problem/E 题意 有n个城市(1e5),有m条单向边(1e5),每一周有d天(50),对于每个城市假如在某一天为1表示这 ...