js实现把图片的绝对路径转为base64字符串、blob对象再上传


Posted in Javascript onDecember 29, 2016

主题:

JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串、blob对象在上传。

用处:

从本地选择图片上传,如项目规定只能选择本项目文件夹下的图像上传为头像等。

主要思想:

使用canvas.toDataURL()方法将图片的绝对路径转换为base64编码.

具体用法:

在这我们引用淘宝服务器上的一张图片举例:

var imgSrc = "https://img.alicdn.com/bao/uploaded/TB1qimQIpXXXXXbXFXXSutbFXXX.jpg";
// var imgSrc = "img/1.jpg";
  function getBase64(img){//传入图片路径,返回base64
  function getBase64Image(img,width,height) {//width、height调用时传入具体像素值,控制大小 ,不传则默认图像大小
   var canvas = document.createElement("canvas");
   canvas.width = width ? width : img.width;
   canvas.height = height ? height : img.height;
 
   var ctx = canvas.getContext("2d");
   ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
   var dataURL = canvas.toDataURL();
   return dataURL;
  }
  var image = new Image();
  image.src = img;
  var deferred=$.Deferred();
  if(img){
   image.onload =function (){
   deferred.resolve(getBase64Image(image));//将base64传给done上传处理
   }
   return deferred.promise();//问题要让onload完成后再return sessionStorage['imgTest']
  }
  }
  getBase64(imgSrc)
  .then(function(base64){
   console.log(base64);
  },function(err){
   console.log(err);
  });

此时在chrome测试,运行时会报错!

原因:

我们使用的是淘宝服务器上的图片,在本地服务器下访问,结果出现图片跨域的问题。

处理方案:

一、将图片放在本地服务器

var imgSrc = "img/1.jpg";//本地项目文件夹下的图片
  function getBase64(img){//传入图片路径,返回base64
  function getBase64Image(img,width,height) {
   var canvas = document.createElement("canvas");
   canvas.width = width ? width : img.width;
   canvas.height = height ? height : img.height;
   var ctx = canvas.getContext("2d");
   ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
   var dataURL = canvas.toDataURL();
   return dataURL;
  }
  var image = new Image();
  image.src = img;
  var deferred=$.Deferred();
  if(img){
   image.onload =function (){
   deferred.resolve(getBase64Image(image));//将base64传给done上传处理
   }
   return deferred.promise();//问题要让onload完成后再return sessionStorage['imgTest']
  }
  }
  getBase64(imgSrc)
  .then(function(base64){
   console.log(base64);
  },function(err){
   console.log(err);
  });

二、 跨域

想引用其他服务器下的图片该如何解决呢?

我们可以使用下面这一句代码解决跨域。

image.crossOrigin = '';

测试在chrome和firefox,ie9+下生效,在目前safari6以下貌似不支持。

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>nick getBase64</title>
</head>
<body>
<div><img id="test" src="" alt=""/></div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
 var imgSrc = "https://img.alicdn.com/bao/uploaded/TB1qimQIpXXXXXbXFXXSutbFXXX.jpg";
// var imgSrc = "img/1.jpg";
  function getBase64(img){//传入图片路径,返回base64
  function getBase64Image(img,width,height) {//width、height调用时传入具体像素值,控制大小 ,不传则默认图像大小
   var canvas = document.createElement("canvas");
   canvas.width = width ? width : img.width;
   canvas.height = height ? height : img.height;
 
   var ctx = canvas.getContext("2d");
   ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
   var dataURL = canvas.toDataURL();
   return dataURL;
  }
  var image = new Image();
  image.crossOrigin = '';
  image.src = img;
  var deferred=$.Deferred();
  if(img){
   image.onload =function (){
   deferred.resolve(getBase64Image(image));//将base64传给done上传处理
   }
   return deferred.promise();//问题要让onload完成后再return sessionStorage['imgTest']
  }
  }
  getBase64(imgSrc)
  .then(function(base64){
   console.log(base64);
  },function(err){
   console.log(err);
  });
</script>
</body>
</html>

上面是本功能的完整代码,亲们,可以测试咯!

这样就本地图片和其他服务器上的图片都可以处理了!

结语:

想要了解更多的有关上传头像功能,可参考《浅析上传头像示例及其注意事项》

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
Nov 24 Javascript
js 操作select相关方法函数
Dec 06 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
Feb 24 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
Sep 01 Javascript
微信小程序 欢迎页面的制作(源码下载)
Jan 09 Javascript
ES6中class类用法实例浅析
Apr 06 Javascript
详解node.js搭建代理服务器请求数据
Apr 08 Javascript
AngularJS实现表单元素值绑定操作示例
Oct 11 Javascript
详解nuxt路由鉴权(express模板)
Nov 21 Javascript
如何在微信小程序里面退出小程序的方法
Apr 28 Javascript
element 动态合并表格的步骤
Dec 31 Javascript
详解CocosCreator消息分发机制
Apr 16 Javascript
jQuery实现6位数字密码输入框
Dec 29 #Javascript
JQuery统计input和textarea文字输入数量(代码分享)
Dec 29 #Javascript
jQuery中的siblings()是什么意思(推荐)
Dec 29 #Javascript
JQuery获取鼠标进入和离开容器的方向
Dec 29 #Javascript
jQuery实现遮罩层登录对话框
Dec 29 #Javascript
JS实现的简易拖放效果示例
Dec 29 #Javascript
使用DeviceOne实现微信小程序功能
Dec 29 #Javascript
You might like
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
详解微信小程序动画Animation执行过程
2020/09/23 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
Python打印斐波拉契数列实例
2015/07/07 Python
深入解读Python解析XML的几种方式
2016/02/16 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
关于Django Models CharField 参数说明
2020/03/31 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
python实现ping命令小程序
2020/12/28 Python
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
英国自行车商店:AW Cycles
2021/02/24 全球购物
毕业生机械建模求职信
2013/10/14 职场文书
总经理司机职责
2014/02/02 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
Nginx 匹配方式
2022/05/15 Servers