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实现的listview效果
Apr 28 Javascript
JavaScript获取GridView选择的行内容
Apr 14 Javascript
JavaScript 对象链式操作测试代码
Apr 25 Javascript
JS实现双击编辑可修改状态的方法
Aug 14 Javascript
js将json格式的对象拼接成复杂的url参数方法
May 25 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
Sep 14 Javascript
js对字符串进行编码的方法总结(推荐)
Nov 10 Javascript
vue-cli入门之项目结构分析
Apr 20 Javascript
vue-resource 拦截器(interceptor)的使用详解
Jul 04 Javascript
用js实现before和after伪类的样式修改的示例代码
Sep 07 Javascript
微信小程序CSS3动画下拉菜单效果
Nov 04 Javascript
vue绑定class的三种方法
Dec 24 Vue.js
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
PHP7之Mongodb API使用详解
2015/12/26 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
用js做一个小游戏平台 (一)
2009/12/29 Javascript
javascript 鼠标拖动图标技术
2010/02/07 Javascript
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
python实现360的字符显示界面
2014/02/21 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
什么是python的id函数
2020/06/11 Python
python语言是免费还是收费的?
2020/06/15 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
医院护士求职自荐信格式
2013/09/21 职场文书
木工主管岗位职责
2013/12/08 职场文书
教师个人鉴定材料
2014/02/08 职场文书
《争吵》教学反思
2014/02/15 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server