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

先上代码吧:

 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. js中console在一行内打印字符串和对象

    在前端开发中,大多数的调试一般都是F12中的console和network中查看请求数据和响应数据,也有一部分人喜欢用debugger. 在开发大一些的项目时,在开发环境下,打开着控制台,切换一下页面 ...

  2. linux关闭ACPI电源管理模块

    一.运行环境 # cat /etc/redhat-release CentOS release 6.2 (Final) # uname -a Linux web-server- -.el6.x86_6 ...

  3. (导航页)OpenStack-M版-双节点手工搭建-附B站视频

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 本次搭建采用双节点,离线源搭建, 配置如下 本次搭建采用2台4核4G的虚拟机,也可以改为2核4G ...

  4. Mysql使用语法总结

    查看数据库 show databases; 使用数据库 use honeypot; 查看数据表 show tables; 查看数据表结构 desc TABLEname; 修改数据表的某个字段的类型 a ...

  5. XML 配置文件,知识点

    namespace 属性:配置成接口的全限定名称,将 Mapper 接口和 XML 文件关联起来: select 标签的 id 属性值,对应定义的接口方法名. insert 标签的属性 paramet ...

  6. js中,null, '',undefined的区别

    在js中有三种值都可以代表false  "",null,undefined 那么他们之间到底有什么区别呢 首先我们先看这三种值得类型 ""代表了一个没有字符的字 ...

  7. zz详解深度学习中的Normalization,BN/LN/WN

    详解深度学习中的Normalization,BN/LN/WN 讲得是相当之透彻清晰了 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Ba ...

  8. OpenStack Nova

    OpenStack Nova 简介 OpenStack 中的 Nova 负责维护和管理云环境的计算资源 Nova 在现有 Linux 服务器上作为一组守护线程来提供服务 Nova 由多个服务器进程组成 ...

  9. Excel-图表制作

    柱形图:通常使用柱形图比较数据间的数量关系 折线图:使用折线图来反映数据间的趋势关系 饼图:使用饼图来表示数据间的分配关系  对图表进行刷选 再图表设计下的快速布局可以选择各种样式 迷你图  对某列单 ...

  10. ESP8266 LUA脚本语言开发: 准备工作-LUA开发说明

    前言 开发Lua需要使用这个软件 注:该软件需要按照JDK  即 JAVA虚拟机,如果没有安装过JDK,请先看JDK安装教程安装JDK USB线连接开发板接入电脑 选择自己的串口号 波特率115200 ...