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 Chart 插件整理
Jun 18 Javascript
js批量设置样式的三种方法不推荐使用with
Feb 25 Javascript
JavaScript程序开发之JS代码放置的位置
Jan 15 Javascript
用NODE.JS中的流编写工具是要注意的事项
Mar 01 Javascript
Kotlin学习第一步 kotlin语法特性
May 25 Javascript
js实现数组内数据的上移和下移的实例
Nov 14 Javascript
微信小程序之多文件下载的简单封装示例
Jan 29 Javascript
使用node.js实现微信小程序实时聊天功能
Aug 13 Javascript
angularjs中判断ng-repeat是否迭代完的实例
Sep 12 Javascript
JS动画实现回调地狱promise的实例代码详解
Nov 08 Javascript
vue 插件的方法代码详解
Jun 06 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
Apr 29 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
php auth_http类库进行身份效验
2009/03/19 PHP
php 模拟POST|GET操作实现代码
2010/07/20 PHP
php下正则来匹配dede模板标签的代码
2010/08/21 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
php源码的安装方法和实例
2019/09/26 PHP
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
[04:52]2015国际邀请赛LGD战队晋级之路
2015/08/14 DOTA
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
浅谈Python的垃圾回收机制
2016/12/17 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
Django多数据库的实现过程详解
2019/08/01 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
用python批量移动文件
2021/01/14 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
thinkphp5 路由分发原理
2021/03/18 PHP
会计实习自我鉴定
2013/12/04 职场文书
新郎新娘婚礼答谢词
2014/01/11 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
副科级后备干部考察材料
2014/05/15 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
学校2014年度工作总结
2014/12/06 职场文书
求职信范文怎么写
2015/03/19 职场文书