博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
跨域获取图片并自行上传保存
阅读量:6813 次
发布时间:2019-06-26

本文共 2747 字,大约阅读时间需要 9 分钟。

hot3.png

跨域获取图片并自行上传保存

涉及点:

  1. 跨域 CORS 协议

    1. 为什么使用cors,不使用jsonp?因为cors更强大,方便安全,还不需要修改大量的前后端数据格式,只需修改服务器配置参数,与请求参数。

    2. 想要跨域获取数据与资源,必须由对方服务器开启 CORS 协议,通过认证或公开获取数据与资源。

    3. ajax跨域请求时,需要手动开启,跨区请求参数:crossDomain: true

      $.ajax({    beforeSend : function (xhr) {    },    error      : function () {    },    crossDomain: true,    method     : "GET",    url        : URL,    dataType   : "json",    timeout    : 3000})
  2. 实例与常用类型转换

  • 主要思路:首先通过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});};
  1. 数据上传与保存

    1. 使用FormData方法包装数据,支持blob类型,File 接口基于 Blob

      var fd = new FormData();fd.append('indexKey',blod);
    2. 使用xhr上传

      var request = new XMLHttpRequest();request.open("POST", Url);request.send(fd);
参考资料
  1. cors 相关
  2. Blob 相关
  3. 其他相关

转载于:https://my.oschina.net/u/3756690/blog/2876713

你可能感兴趣的文章
表单元素与提示文字无法对齐的问题(input,checkbox文字对齐)
查看>>
docker
查看>>
Zookeeper C API 指南四(C API 概览)
查看>>
MyCAT与MySQL导入、导出文件
查看>>
Custom.pll : ZOOM小测试
查看>>
打印机如何取消打印任务
查看>>
表单非空验证的问题
查看>>
比rufus/scheduler更独立简洁的定时脚本必备whenever
查看>>
java中判断字符串是否为数字的三种方法
查看>>
[LeetCode] House Robber
查看>>
【转】保证训练集和测试集取到和数据集中相同比例的类别
查看>>
三、事件循环
查看>>
自动化测试神器 之 python unittest 断言
查看>>
[LeetCode]题解(python):067-Add Binary
查看>>
Cannot complete this action,please try again. Correlation ID :bd640a9d-4c19-doff-2fe0-6ce1104b59ae
查看>>
云计算与虚拟化
查看>>
最短路(path)
查看>>
Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)
查看>>
JAVA日期加减运算
查看>>
ubuntu下安装mysql及卸载mysql方法
查看>>