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

先上代码吧:

 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. 分分钟搞定Redis编译安装

    1.  依赖包安装 yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc- ...

  2. 关于SQLite数据库 字段 DateTime 类型

    这两天刚接触SQLite 数据库 还没有太过于深入的了解 , 于是出现了一个问题 : 我在 C#中 ,使用SQLiteHelper 查询SQLite数据库数据时,报了这个错误: System.Form ...

  3. 《高性能 Go 代码工坊》中译

    深入研究 Go 应用性能提升的英语系列文章,这里是中译 https://www.yuque.com/ksco/uiondt

  4. Pyqt5开发一款小工具(翻译小助手)

    翻译小助手 开发需求 首先五月份的时候,正在学习爬虫的中级阶段,这时候肯定要接触到js逆向工程,于是上网找了一个项目来练练手,这时碰巧有如何进行对百度翻译的API破解思路,仿造网上的思路,我摸索着完成 ...

  5. 团队第五次作业——Alpha2版本

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/ 这个作业要求在哪里 https:// ...

  6. torchline:让Pytorch使用的更加顺滑

    torchline地址:https://github.com/marsggbo/torchline 相信大家平时在使用Pytorch搭建网络时,多少还是会觉得繁琐,因为我们需要搭建数据读取,模型,训练 ...

  7. HBuilder创建app 3

    一.Audio 模块实现开启手机摄像头 基于html5 plus http://www.html5plus.org/doc/zh_cn/audio.html 栗子: <!DOCTYPE html ...

  8. 微信小程序 - 事件 | 传递 | 冒泡

    事件 常见的事件有: 类型 触发条件 最低版本 touchstart 手指触摸动作开始   touchmove 手指触摸后移动   touchcancel 手指触摸动作被打断,如来电提醒,弹窗   t ...

  9. 【oracle】ORA-12638 : 身份证明检索失败

    sqlnet.ora 1.删了 2.#注释了 背后缘由:待写

  10. vscode用服务打开html

    ①安装插件 此时右击会有: ②anywhere