在使用FileReader.readAsDataURL()时,处理不能不能连续选择同一个文件的问题

在现在的网页开发中,在用户上传图片时,一般都会在用户提供一下预览功能,html5的FileReader()可以直接用我们实现预览,而不用先上传到后台再实现预览,同时结合canvas可以让我们轻松的实现压缩图片

 

以下是核心代码

function readFile(obj) {
    var file = obj.target.files[0];
        if (!file) {
            return;
        }
  // 判断类型是不是图片
  if (!/image\/\w+/.test(file.type)) {
       hint("请确保文件为图像类型");
       return false;
  }
  if (Math.floor(file.size / 1024) > 1024 * 10) {
       hint("上传的图片不得大于10M");
        return;
  }
  // 如果大于2m的图片就进行压缩
  shouldCompress = 0;
  if (Math.floor(file.size / 1024) > 1024 * 2) {
       shouldCompress = 1;
  }
    uiLoading.show();提示开始上传
         var reader = new FileReader();
         reader.readAsDataURL(file);

         reader.onload = function(e) {这里的逻辑可以自定义,例如获取图片后放到哪里,增加删除操作等
               var imageData = this.result;

               var eDiv = document.createElement("div");

               eDiv.className = 'photo-view';
               var removeBtn = document.createElement('i');//这里创建删除图片的标签
                    removeBtn.className = 'removeBtn';
                      removeBtn.setAttribute('data-index', target);
                   eDiv.appendChild(removeBtn);
                   var img = document.createElement('img');
                    img.src = imageData;
                  eDiv.appendChild(img);

                    var eDiv1 = document.createElement("div"),
                         eDiv2 = document.createElement("div");
                           eDiv1.className = "wrap-pic";
                           eDiv2.className = "span6";
                           eDiv1.appendChild(eDiv);
                          eDiv2.appendChild(eDiv1);
                       $productPhoto.parents('.span6').before(eDiv2);
         

            /* 压缩图片 */
            compressImg(imageData, (shouldCompress == 1 ? 0.3 : 0.7));

           }
              reader.onloadend = function() {
                  uiLoading.stop();//清除上传提示
         }
};

function compressImg(src, percent) {
  var begintime = new Date().getTime();
  var percent = percent || 0.7;
  var oImg = new Image();
  oImg.src = src;
  oImg.onload = function() {
    oCanvas.width = this.width;
    oCanvas.height = this.height;
    oCtx.clearRect(0, 0, this.width, this.height);
    oCtx.drawImage(oImg, 0, 0);
    var img = oCanvas.toDataURL('image/jpeg', percent).split('base64,')[1];

    projectUrl.push(img);这里把base64保存起来传给后台

  }
}

 

$productPhoto.on("change", function(e) {
   readFile(e);
  $(this).val(''); //清除获取的值,为了可以连续上传同一张
})

 

参考链接:

https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

http://www.zhangxinxu.com/wordpress/2017/07/html5-canvas-image-compress-upload/

posted @ 2017-12-22 15:20  十nian  阅读(2962)  评论(0编辑  收藏  举报