• 在使用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/

  • 相关阅读:
    Linux与Windows共享文件夹之samba的安装与使用(Ubuntu为例)
    linux下导入、导出mysql数据库命令
    navicat for mysql (10038)如何解决,远程无法连接问题
    js过滤前后空格
    js大小写转换
    Sublime Text 超好用的侧栏插件SideBarEnhancements
    nginx,FastCGI启动语句
    Samba Linux和Windows互访
    JS 添加千分位,测试可以使用
    Sublime Text插件:HTML+CSS+JAVASCRIPT+JSON快速格式化
  • 原文地址:https://www.cnblogs.com/yanzai/p/8086160.html
Copyright © 2020-2023  润新知