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 相关文章推荐
推荐20家国外的脚本下载网站
Apr 28 Javascript
判断客户浏览器是否支持cookie的示例代码
Dec 23 Javascript
js获取视频时长代码
Apr 10 Javascript
jQuery中使用each处理json数据
Apr 23 Javascript
js模拟淘宝网的多级选择菜单实现方法
Aug 18 Javascript
JS+CSS实现的经典tab选项卡效果代码
Sep 16 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
Javascript 实现 Excel 导入生成图表功能
Oct 22 Javascript
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
深入理解 JS 垃圾回收
Jun 03 Javascript
微信小程序实现拖拽功能
Sep 26 Javascript
使用react+redux实现计数器功能及遇到问题
Jun 02 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
浅谈php自定义错误日志
2015/02/13 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
JavaScript中反正弦函数Math.asin()的使用简介
2015/06/14 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
Python操作json数据的一个简单例子
2014/04/17 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
python获取目录下所有文件的方法
2015/06/01 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
举例讲解如何在Python编程中进行迭代和遍历
2016/01/19 Python
Python实现求数列和的方法示例
2018/01/12 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Python3多线程版TCP端口扫描器
2019/08/31 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
少先队入队活动方案
2014/02/08 职场文书
高中教师考核方案
2014/05/18 职场文书
明星邀请函
2015/02/02 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
React更新渲染原理深入分析
2022/12/24 Javascript