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 相关文章推荐
TopList标签和JavaScript结合两例
Aug 12 Javascript
仿163填写邮件地址自动显示下拉(无优化)
Nov 05 Javascript
关于 文本框默认值 的操作js代码
Jan 12 Javascript
js实现双击图片放大单击缩小的方法
Feb 17 Javascript
学习使用bootstrap基本控件(table、form、button)
Apr 12 Javascript
js判断输入字符串是否为空、空格、null的方法总结
Jun 14 Javascript
移动端js图片查看器
Nov 17 Javascript
基于React Native 0.52实现轮播图效果
Aug 25 Javascript
vue微信分享到朋友圈 vue微信发送给好友
Nov 28 Javascript
基于Vue SEO的四种方案(小结)
Jul 01 Javascript
vue中提示$index is not defined错误的解决方式
Sep 02 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
Nov 12 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 Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
2014/07/04 PHP
php实现的常见排序算法汇总
2014/09/08 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
jquery 元素相对定位代码
2010/10/15 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
vue中如何使用ztree
2018/02/06 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
vue如何进行动画的封装
2018/09/26 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
Python中的choice()方法使用详解
2015/05/15 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
Python全局变量用法实例分析
2016/07/19 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
正风肃纪剖析材料
2014/02/18 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
总经理检讨书范文
2015/02/16 职场文书
英语辞职信怎么写
2015/02/28 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL