这段时间在工作中碰到一个需要在h5裁剪图像,然后直传阿里云的需求。图中遇到了一些小问题,分享出来大家都看看。

h5裁剪图像:cropper.js是一个神器啊关于用法,网上可以收罗出大量的帖子,这里我就不多说了,大致原理就是利用canvas裁剪图像然后生成base64的图像(canvas.toDataURL('image/jpeg'))。

转换Blob对象:接下来就是重点了,上传图片我们比较传统的做法就是将 canvas.toDataURL('image/jpeg')  传到后台,然后后台再生成图片传到阿里云。

这样就显得比较繁琐了,怎么将 canvas.toDataURL('image/jpeg')直接传到阿里云?这就懵逼了。这里不得不提到js的另一个东西,Blob对象。

file对象大家都不陌生了,那这个blob又是个什么鬼呢?而实际上 file 对象只是 blob 对象的一个更具体的版本,blob 存储着大量的二进制数据,并且 blob 的 size 和 type 属性,都会被 file 对象所继承。

所以, 在大多数情况下,blob 对象和 file 对象可以用在同一个地方,例如,可以使用 FileReader 借口从 blob 读取数据,也可以使用 URL.createObjectURL() 从 blob 创建一个新的 URL 对象。

这里我先用了canvas一个最简单的办法,创建blob。canvas.toBlob(callback,type,quality);我们可以直接把上传图片的方法写到回调里面,type:类型(图片:‘image/jpeg’),quality:图片质量(0-1).

当然这么高级的方法肯定会涉及到兼容性问题。那我们就回到blob对象的问题上来吧。在chrome早先版本和目前的android中,至少是andrid5.1之前的浏览器,包括微信浏览器等,都不支持blob的构造方法,需要使用BlobBuilder。

var file=new Blob( [array.buffer], {type : "image/jpeg"});//会存在兼容性问题。这个blob的构造方法,在ios手机浏览器是支持的,但是在android手机浏览器不行。

桌面版的chrome浏览器解决了这个blob bug, 但是android手机还是有这个问题,会返回一个type error,因为android浏览器不支持这个构造方法。你必须使用老版本的BlobBuilder API.

解决办法:

 //首先要将dataURL转换为Uint8Array对象:

               function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return u8arr ;
}
// 接下来的事情就好办多了,来一发兼容性blob写法:
try{
var jpeg = new Blob( [array], {type : "image/jpeg"});
}
catch(e){
// TypeError old chrome and FF
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
if(e.name == 'TypeError' && window.BlobBuilder){
var bb = new BlobBuilder();
bb.append([array.buffer]);
var jpeg = bb.getBlob("image/jpeg");
}
else if(e.name == "InvalidStateError"){
// InvalidStateError (tested on FF13 WinXP)
var jpeg = new Blob( [array.buffer], {type : "image/jpeg"});
}
else{
// We're screwed, blob constructor unsupported entirely
}
}

  

上传到阿里云:
我查了一下阿里云的web直传的Js示例代码,感觉写的有点复杂,还是用ajax来解决这个问题吧,还是先上代码再来大致讲一下这个问题吧。
  Utils.ajax({
url: url1,//url1是先向后台请求上传阿里云的一些参数接口
success: function (res) {
if (res.errorCode == 0) {
var ossData=new FormData();
ossData.append("OSSAccessKeyId",res.data.accessId);//Bucket 拥有者的Access Key Id。
ossData.append("policy",res.data.policy);//policy规定了请求的表单域的合法性
ossData.append("Signature",res.data.signature);//根据Access Key Secret和policy计算的签名信息,OSS验证该签名信息从而验证该Post请求的合法性
//---以上都是阿里的认证策略
ossData.append("key",res.data.dir+'/'+res.data.filename+'.jpg');//文件名字,可设置路径
ossData.append("success_action_status",'200');// 让服务端返回200,不然,默认会返回204
ossData.append('file', jpeg);//需要上传的文件 file 这个
//接下来就是上传阿里云了的代码了
//ossData.append("callback",callbackbody);//回调,非必选,可以在policy中自定义
$.ajax({
url : res.data.host, //上传阿里地址
data : ossData,
processData: false,//默认true,设置为 false,不需要进行序列化处理
cache: false,//设置为false将不会从浏览器缓存中加载请求信息
async: false,//发送同步请求
contentType: false,//避免服务器不能正常解析文件---------具体的可以查下这些参数的含义
//dataType: 'JSON',//不涉及跨域 写json即可
type : 'post',
success : function(callbackHost, request) {}, //callbackHost:success,request中就是 回调的一些信息,包括状态码什么的
error : function() {
alert("图片上传出错!")
}
});
}
}
});

  

其实Utils.ajax和$.ajax都是一样的,为了区分我这样写的,Utils.ajax的请求是为了得到后台的验证。上传阿里云的一些证书啊,验证码什么的。$.ajax就是上传到阿里云的请求。值得注意点是:

ossData.append('file', jpeg);//需要上传的文件 file 这个jpeg就是我们前面创建的blob。一般上传到阿里云成功后如果不返回任何东西,就不要写入dataType了。

过程大概就是这样,参考了几个人的文章推荐给大家:https://www.cnblogs.com/flicat/p/5337054.html       TypeArray、ArrayBuffer、Blob、File、DataURL、canvas的相互转换

http://blog.csdn.net/u012811805/article/details/53885008  移动端UC浏览器不支持Blob的解决方案

https://www.cnblogs.com/mottled/p/6979536.html              阿里OSS ajax方式 web直传

            
												

关于H5裁剪图片后,直传阿里云的一些问题的更多相关文章

  1. base64格式的图片上传阿里云

    base64格式的图片上传阿里云 上传图片的时候,除了普通的图片上传,还有一张图片信息是以base64格式发送到后台的. 后台接受base64格式的图片,上传至阿里云代码:(主要是将base64转化成 ...

  2. 微信小程序中图片上传阿里云Oss

    本人今年6月份毕业,最近刚在上海一家小公司实习,做微信小程序开发.最近工作遇到一个小问题. 微信小程序图片上传阿里云服务器Oss也折腾了蛮久才解决的,所以特意去记录一下. 第一步:配置阿里云地址: 我 ...

  3. 百度editor调用【图片上传阿里云】

    百度editor调用简单,但是图片和文件上传阿里云就有点难度了.下面我详细说一下. 百度富文本编辑器下载地址:http://ueditor.baidu.com/website/download.htm ...

  4. 如何用云存储和CDN加速网站图片视频、阿里云OSS的使用(转)

    总有人说阿里云主机带宽小,那只是因为你还停留在单机架构上. 阿里的架构设计,云主机主要用来跑程序的,附件的存储和访问主要靠OSS. 有人又会说了,OSS按存储费+流量双重计费伤不起,只是你不知道OSS ...

  5. Sts 授权直传阿里云 OSS-.net core实现

    前言 磁盘怎么又满了?赶紧 快 打电话给运维扩容扩容扩容!这个问题已经是我入职新公司两个月来,第 3 次听到了.经过一通了解,事情原来是这样的.虽然我们使用了阿里云的 OSS 对象存储服务,但是为了不 ...

  6. jquery photoClip支持手机端,PC端 本地裁剪图片后上传插件

    支持手机,PC最好的是jquery photoClip插件,下载地址&示例:https://github.com/topoadmin/photoClip demo.html 代码: <! ...

  7. 微信小程序裁剪图片后上传

    上传图片的时候调起裁剪页面,裁剪后再回调完成上传; 图片裁剪直接用we-cropper   https://github.com/we-plugin/we-cropper we-cropper使用详细 ...

  8. 小程序踩坑记录-上传图片及canvas裁剪图片后上传至服务器

    最近在写微信小程序的上传图片功能,趟过了一些坑记录一下. 想要满足的需求是,从手机端上传图片至服务器,为了避免图片过大影响传输效率,需要把图片裁剪至适当大小后再传输 主要思路是,通过wx.choose ...

  9. C# .net Ueditor实现图片上传到阿里云OSS 对象存储

    在学习的时候,项目中需要实现在Ueditor编辑器中将图片上传到云储存中,老师演示的是上传到又拍云存储,既然看了一遍,直接照搬不算本事,咱们可以依葫芦画瓢自己来动手玩玩其它的云存储服务. 现在云计算产 ...

随机推荐

  1. USACO 2004 Open The Cow Lineup /// oj25965

    题目大意: 输入n k,n头牛 k个品种 接下来n行描述每头牛的品种 输出无法找出的最短子序列的长度 Sample Input 14 515325134425123 Sample Output 3 H ...

  2. 树形结构_红黑树:平衡2X 哈夫曼树:最优2X

    红黑树:平衡2X 哈夫曼树:最优2X 红黑树 :TreeSet.TreeMap 哈夫曼树 1. 将w1.w2.…,wn看成是有n 棵树的森林(每棵树仅有一个结点): 2. 在森林中选出根结点的权值最小 ...

  3. CentOS7开放防火墙端口

    ~~~~~~~~~~~~开放某个端口~~~~~~~~~~~~firewall-cmd --zone=public --add-port=6669/tcp --permanentfirewall-cmd ...

  4. 9款很棒的网页绘制图表JavaScript框架脚本

    推荐9款很棒的可在网页中绘制图表的JavaScript脚本,这些有趣的JS脚本可以帮助你快速方便的绘制图表(线.面.饼.条…),其中包括jQuery.MooTools.Prototype和一些其它的J ...

  5. unity3D笔记の四种调用其他脚本方法

    第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名() 第二种,GameObject.Find("脚本所在的物体的名字").SendMessage(" ...

  6. scrapy 多个爬虫运行

    from scrapy import cmdline import datetime import time import os import scrapy from scrapy.crawler i ...

  7. java 迷你DVD管理器

    1.DvdSet类 package dvd_01; /** * 定义dvd的一些属性 * @author Administrator * */ public class DvdSet { String ...

  8. Oracle闪回查询恢复delete删除数据

    Flashback query(闪回查询)原理 Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回. Flashback q ...

  9. 将文件大小数值转换成B、KB、MB、GB

    //delphi 将文件大小数值转换成B/KB/MB/GB function FormatByteSize(const bytes: Longint): string; const B = 1; // ...

  10. (JS)应为","

    在写cshtml的时候,vs提示:(JS)应为"," 功能无法实现,一般是因为 标点切成全角了,但是我是应为把‘’打成了“” 以下错误示范: $("ol").a ...