JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串blob对象在上传

Posted webNick

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串blob对象在上传相关的知识,希望对你有一定的参考价值。

主题:

  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>

  上面是本功能的完整代码,亲们,可以测试咯!

  这样就本地图片和其他服务器上的图片都可以处理了!

结语:

  FileReader上传头像功能我以前的博客也详细介绍过,具体参考http://www.cnblogs.com/puyongsong/p/5981234.html!

  本功能我在项目中用于规定只能选择本项目文件夹下的图像上传为头像或封面等,我将会具体分析出该功能的实现,最后在将完整代码附上!

  其中,涉及到了deferred,我将在下篇博客中总结一下,在附上地址!

  本博客中有改正的地方,望各位大大不吝赐教,多多留言、评论、批评……

  
 

 

以上是关于JavaScript把项目本地的图片或者图片的绝对路径转为base64字符串blob对象在上传的主要内容,如果未能解决你的问题,请参考以下文章

js把通过图片路径生成base64

jsp网页在浏览器中不显示图片_eclipse环境下配置tomcat中jsp项目的虚拟路径

pb如何设置图片相对路径

IOS把图片缓存到本地的几种方法

小程序图片处理

javascript 网页截图 保存为本地图片