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 相关文章推荐
Javascript valueOf 使用方法
Dec 28 Javascript
使用apply方法处理数组的三个技巧[译]
Sep 20 Javascript
js事件冒泡实例分享(已测试)
Apr 23 Javascript
jquery中文乱码的多种解决方法
Jun 21 Javascript
可自己添加html的伪弹出框实现代码
Sep 08 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
Nov 06 Javascript
jQuery.holdReady()方法用法实例
Dec 27 Javascript
json的使用小结
Jun 08 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
Sep 19 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
Dec 28 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
Jul 06 Javascript
利用layer实现表单完美验证的方法
Sep 26 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与ASP
2006/10/09 PHP
php 购物车实例(申精)
2009/05/11 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
jquery uaMatch源代码
2011/02/14 Javascript
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
深入分析Javascript事件代理
2016/01/30 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
卸载安装Node.js与npm过程详解
2016/08/15 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
python赋值操作方法分享
2013/03/23 Python
python实现html转ubb代码(html2ubb)
2014/07/03 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python提取频域特征知识点浅析
2019/03/04 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
罗技美国官网:Logitech美国
2020/01/22 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
银行柜员应聘推荐信范文
2013/11/24 职场文书
个人收入证明范本
2014/01/12 职场文书
大学生社团活动总结
2014/04/26 职场文书
2015年高考寄语或鼓励的话
2015/03/23 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
golang中的空slice案例
2021/04/27 Golang
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript