跨域获取图片并自行上传保存
涉及点:
-
跨域 CORS 协议
-
为什么使用
cors
,不使用jsonp
?因为cors
更强大,方便安全,还不需要修改大量的前后端数据格式,只需修改服务器配置参数,与请求参数。 -
想要跨域获取数据与资源,必须由对方服务器开启 CORS 协议,通过认证或公开获取数据与资源。
-
ajax
跨域请求时,需要手动开启,跨区请求参数:crossDomain: true
$.ajax({ beforeSend : function (xhr) { }, error : function () { }, crossDomain: true, method : "GET", url : URL, dataType : "json", timeout : 3000})
-
-
实例与常用类型转换
-
主要思路:首先通过
Image
对象下载图片,然后通过canvas
对象,转换成需要的类型,最后进行保存。-
==跨域获取的重要参数==:
crossOrigin= "anonymous"
,下面是实例:var img = new Image();img.src = url;// 跨域重点参数img.crossOrigin = "Anonymous";img.onload = function () { // 压缩质量可以根据实际情况调整 var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); // 设置 canvas 的宽度和高度 canvas.width = this.width; canvas.height = this.height; // 把图片绘制到 canvas 中 ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 取出 Blob 格式数据, 并发送 canvas.toBlob(function (blod) { var fd = new FormData(); fd.append('key',blod); var request = new XMLHttpRequest(); request.open("POST", URL); request.send(fd); },'image/jpeg');};
-
-
基本常用转变方法整理
-
通过
url
路径,返回image
对象function UrlToImage (url,fn){ var img = new Image(); img.src = url; img.onload = function(){ fn(img); }};
-
将
image
对象转变为canvas
类型function ImageToCanvas(image){ var cvs = document.createElement("canvas"); var ctx = cvs.getContext('2d'); cvs.width = image.width; cvs.height = image.height; ctx.drawImage(image, 0, 0, cvs.width, cvs.height); return cvs ;};
-
将
canvas
对象转变为blob
类型对象,blob()
方法非常强大。function CanvasResizeToFile(canvas,quality,fn){ canvas.toBlob(function(blob) { fn(blob); },'image/jpeg',quality);};
-
File
接口基于Blob
,继承了Blob
的功能并将其扩展使其支持用户系统上的文件。我们可以把它当做File
类型对待,其他更具体的用法可以参考MDN文档
-
-
将
canvas
对象转变为dataUrl
字符串function CanvasResizeToDataURL(canvas,quality){ return canvas.toDataURL('image/jpeg',quality);};
-
将
flie(blob)
类型转变为dataUrl
字符串function FileToDataURL(file,fn){ var reader = new FileReader(); reader.onloadend = function(e){ fn(e.target.result); }; reader.readAsDataURL(file);};
-
将
dataUrl
字符串转变为image
类型对象function DataUrlToImage(dataurl,fn){ var img = new Image(); img.onload = function() { fn(img); }; img.src = dataurl;};
-
将
dataUrl
字符串转变为blob
类型对象function DataUrlToFile(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 new Blob([u8arr], {type:mime});};
-
-
数据上传与保存
-
使用
FormData
方法包装数据,支持blob
类型,File
接口基于Blob
。var fd = new FormData();fd.append('indexKey',blod);
-
使用
xhr
上传var request = new XMLHttpRequest();request.open("POST", Url);request.send(fd);
-
参考资料
- cors 相关
- Blob 相关
- 其他相关