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入门教程(3) js面向对象
Jan 31 Javascript
javascript css在IE和Firefox中区别分析
Feb 18 Javascript
Jquery公告滚动+AJAX后台得到数据
Apr 14 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
利用Jquery实现可多选的下拉框
Feb 21 Javascript
删除条目时弹出的确认对话框
Jun 05 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
Jul 27 Javascript
Javascript 动态改变imput type属性
Nov 01 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
Dec 20 Javascript
在一个页面实现两个zTree联动的方法
Dec 20 Javascript
JS实现骰子3D旋转效果
Oct 24 Javascript
Js类的构建与继承案例详解
Sep 15 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数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
基于Jquery的温度计动画效果
2010/06/18 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
不假外出检讨书
2014/01/27 职场文书
贷款委托书怎么写
2014/08/02 职场文书
电影焦裕禄观后感
2015/06/09 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
python实现简单的三子棋游戏
2022/04/28 Python
MySQL普通表如何转换成分区表
2022/05/30 MySQL