`

前端图片压缩上传(纯js的质量压缩,非长宽压缩)

阅读更多
 <meta charset="UTF-8">
  <title> XMLHttpRequest上传文件 </title>
  <script type="text/javascript">
    /*
        三个参数
        file:一个是文件(类型是图片格式),
        w:一个是文件压缩的后宽度,宽度越小,字节越小
        objDiv:一个是容器或者回调函数
        photoCompress()
        */
    function photoCompress(file, w, objDiv) {
      var ready = new FileReader();
      /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
      ready.readAsDataURL(file);
      ready.onload = function () {
        var re = this.result;
        canvasDataURL(re, w, objDiv)
      }
    }

    function canvasDataURL(path, obj, callback) {
      var img = new Image();
      img.src = path;
      img.onload = function () {
        var that = this;
        // 默认按比例压缩
        var w = that.width,
          h = that.height,
          scale = w / h;
        w = obj.width || w;
        h = obj.height || (w / scale);
        var quality = 0.7; // 默认图片质量为0.7
        //生成canvas
        var canvas = document.createElement('canvas');
        var ctx = canvas.getContext('2d');
        // 创建属性节点
        var anw = document.createAttribute("width");
        anw.nodeValue = w;
        var anh = document.createAttribute("height");
        anh.nodeValue = h;
        canvas.setAttributeNode(anw);
        canvas.setAttributeNode(anh);
        ctx.drawImage(that, 0, 0, w, h);
        // 图像质量
        if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
          quality = obj.quality;
        }
        // quality值越小,所绘制出的图像越模糊
        var base64 = canvas.toDataURL('image/jpeg', quality);
        // 回调函数返回base64的值
        callback(base64);
      }
    }
    /**
     * 将以base64的图片url数据转换为Blob
     * @param urlData
     *            用url方式表示的base64图片数据
     */
    function convertBase64UrlToBlob(urlData) {
      var arr = urlData.split(','),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new Blob([u8arr], {
        type: mime
      });
    }


    var xhr;
    //上传文件方法
    function UpladFile() {
      var fileObj = document.getElementById("file").files[0]; // js 获取文件对象
      var url = "后台图片上传接口"; // 接收上传文件的后台地址 

      var form = new FormData(); // FormData 对象

      if (fileObj.size / 1024 > 1025) { //大于1M,进行压缩上传
        photoCompress(fileObj, {
          quality: 0.2
        }, function (base64Codes) {
          //console.log("压缩后:" + base.length / 1024 + " " + base);
          var bl = convertBase64UrlToBlob(base64Codes);
          form.append("file", bl, "file_" + Date.parse(new Date()) + ".jpg"); // 文件对象
          xhr = new XMLHttpRequest(); // XMLHttpRequest 对象
          xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。
          xhr.onload = uploadComplete; //请求完成
          xhr.onerror = uploadFailed; //请求失败

          xhr.upload.onprogress = progressFunction; //【上传进度调用方法实现】
          xhr.upload.onloadstart = function () { //上传开始执行方法
            ot = new Date().getTime(); //设置上传开始时间
            oloaded = 0; //设置上传开始时,以上传的文件大小为0
          };

          xhr.send(form); //开始上传,发送form数据
        });
      } else { //小于等于1M 原图上传
        form.append("file", fileObj); // 文件对象
        xhr = new XMLHttpRequest(); // XMLHttpRequest 对象
        xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。
        xhr.onload = uploadComplete; //请求完成
        xhr.onerror = uploadFailed; //请求失败

        xhr.upload.onprogress = progressFunction; //【上传进度调用方法实现】
        xhr.upload.onloadstart = function () { //上传开始执行方法
          ot = new Date().getTime(); //设置上传开始时间
          oloaded = 0; //设置上传开始时,以上传的文件大小为0
        };

        xhr.send(form); //开始上传,发送form数据
      }
    }

    //上传成功响应
    function uploadComplete(evt) {
      //服务断接收完文件返回的结果

      var data = JSON.parse(evt.target.responseText);
      if (data.success) {
        alert("上传成功!");
      } else {
        alert("上传失败!");
      }

    }
    //上传失败
    function uploadFailed(evt) {
      alert("上传失败!");
    }
    //取消上传
    function cancleUploadFile() {
      xhr.abort();
    }

    //上传进度实现方法,上传过程中会频繁调用该方法
    function progressFunction(evt) {
      var progressBar = document.getElementById("progressBar");
      var percentageDiv = document.getElementById("percentage");
      // event.total是需要传输的总字节,event.loaded是已经传输的字节。如果event.lengthComputable不为真,则event.total等于0
      if (evt.lengthComputable) { //
        progressBar.max = evt.total;
        progressBar.value = evt.loaded;
        percentageDiv.innerHTML = Math.round(evt.loaded / evt.total * 100) + "%";
      }
      var time = document.getElementById("time");
      var nt = new Date().getTime(); //获取当前时间
      var pertime = (nt - ot) / 1000; //计算出上次调用该方法时到现在的时间差,单位为s
      ot = new Date().getTime(); //重新赋值时间,用于下次计算
      var perload = evt.loaded - oloaded; //计算该分段上传的文件大小,单位b
      oloaded = evt.loaded; //重新赋值已上传文件大小,用以下次计算
      //上传速度计算
      var speed = perload / pertime; //单位b/s
      var bspeed = speed;
      var units = 'b/s'; //单位名称
      if (speed / 1024 > 1) {
        speed = speed / 1024;
        units = 'k/s';
      }
      if (speed / 1024 > 1) {
        speed = speed / 1024;
        units = 'M/s';
      }
      speed = speed.toFixed(1);
      //剩余时间
      var resttime = ((evt.total - evt.loaded) / bspeed).toFixed(1);
      time.innerHTML = ',速度:' + speed + units + ',剩余时间:' + resttime + 's';
      if (bspeed == 0) time.innerHTML = '上传已取消';
    }

 

分享到:
评论

相关推荐

    纯前端图片压缩和预览工具

    纯前端的图片压缩工具能够提高用户体验,减少服务器负担,同时还能有效管理网站的加载速度。本篇文章将详细探讨“纯前端图片压缩和预览工具”的相关知识点。 首先,我们要了解“纯前端”意味着所有处理都在用户的...

    前端图片压缩base64后台还原图片

    前端代码通常涉及用户上传图片、压缩图片并将其转换为base64编码。这里有一个简单的HTML和JavaScript示例: ```html 压缩并上传 const compressBtn = document.getElementById('compressBtn'); const imageInput...

    前端图片上传压缩

    10. **安全问题**:前端压缩不能完全替代后端的安全检查,因为恶意用户可能绕过前端限制,上传大文件或不合法图片。因此,后端仍需进行文件大小和格式的验证。 综上所述,前端图片上传压缩涉及到的技术点广泛,包括...

    html纯前端压缩图片神器,js压缩图片保持原有像素,html图片压缩自定义大小

    标题中的"html纯前端压缩图片神器"是指这个工具完全在用户浏览器上运行,无需服务器端的支持。这种特性使得它在隐私保护和离线应用场景中非常实用。使用JavaScript,特别是canvas元素,可以对图片进行处理,包括读取...

    html5前端图片压缩上传

    利用html5 canvas处理图片,得到图片字节流,上传。前端canvas压缩,代码简洁亲测可用,参考博客 :https://blog.csdn.net/jialiuyang/article/details/50787636;

    前端压缩图片

    前端压缩图片能有效降低图片文件大小,而不会明显降低图片质量,从而达到优化的目的。 前端图片压缩主要有以下几种方式: 1. **HTML5 Canvas压缩**:利用HTML5的Canvas API,可以读取图片数据并调整其质量和大小。...

    android 自定义的处理SD卡下的图片,长宽压缩和质量压缩,大于2M循环长宽压缩一半,如果图片还大于1M,循环质量压缩

    首先做长宽压缩,如果图片太大,先做长宽压缩,暂定大于2M(大小读者可以自己设置)循环做长宽压缩(暂定长宽都压缩一半,山样读者可以自己设置大小),其次做质量压缩,大于1M,循环做质量压缩,直到图片大小在1m...

    jQuery前端图片压缩插件.rar

    图片压缩插件通常工作原理是:在用户上传图片时,插件会自动对图片进行压缩,调整其尺寸和质量,以减少文件大小。在"jQuery前端图片压缩插件.rar"中,这个过程可能涉及到以下技术: 1. 图片读取:使用HTML5的...

    前端JS实现图片压缩,简易好用版

    前端JS实现图片压缩,直接浏览器打开后,选择要压缩的图片文件即可

    HTML5+PHP+JS实现前端压缩上传图片

    针对这一问题,我们可以利用HTML5、PHP和JavaScript技术实现前端图片的压缩上传功能,以优化用户体验。 首先,我们需要理解HTML5中的File API。这个API允许网页在用户设备上直接操作文件,包括读取、写入和处理文件...

    js图片压缩插件

    JavaScript 图片压缩插件是一种用于优化用户在网页上上传大...总之,JavaScript 图片压缩插件如 `LocalResizeIMG.js` 在现代网页应用中起着至关重要的作用,它们有效地解决了大尺寸图片上传的难题,提高了用户体验。

    前端pako压缩与解压缩

    6. **应用场景**:前端压缩通常应用于JSON数据传输、大文件上传前预处理、本地存储数据压缩等场景。 7. **错误处理**:在使用pako时,应考虑处理可能的错误,例如输入数据无效、内存不足等情况。 8. **与其他技术...

    js图片压缩,不会担心图片因为压缩变形

    由于图片往往是网页加载速度的主要影响因素,因此有效地压缩图片可以显著提高页面加载速度,同时保持图片质量。"js图片压缩,不会担心图片因为压缩变形"这个标题表明我们将探讨一种能够保持图片比例的压缩方法,避免...

    前端canvas图片压缩js

    在前端中使用canvas压缩图片的js,转换之后生成Blob文件

    前端压缩裁剪图片并上传阿里oss.zip

    根据公司业务需求在前端裁剪对应的图片,并压缩图片,然后上传到阿里云OSS存储! 找了很久的资料,并没有发现合适的整合dome,于是自己花了一下时间整合了一下, 其中包括了对应的裁剪,压缩,上传有对应的注释...

    java图片压缩处理(可以压缩为任意大小

    本主题将深入探讨如何使用Java实现图片压缩,并能够将其调整到任意大小,同时保持图片质量并避免变形。 首先,我们需要理解图片压缩的基本原理。图片压缩主要有两种类型:有损压缩和无损压缩。有损压缩会牺牲一部分...

    html5 canvas 图片压缩

    总的来说,HTML5 Canvas提供了一种灵活的方式来处理和压缩图片,适配各种浏览器和设备。通过理解并运用上述技术,你可以创建一个高效且兼容性强的图片压缩解决方案,确保在微信、Chrome、Firefox等不同环境中都能...

    C# core 图片压缩 图片无损压缩 图片无损剪切 无损图片压缩 无损图片剪切

    在C# Core中进行图片处理是一项常见的任务,其中包括图片压缩和剪切操作。无损压缩和剪切技术在保持原始图像质量的同时,可以减小文件大小或改变图像的形状。以下将详细介绍C# Core中如何实现这些功能。 首先,我们...

    mui图片压缩上传及回显(包含java后台)

    在这个项目中,我们关注的是如何利用`mui`进行图片的压缩上传以及在前端回显,同时配合Java后台完成整个流程。 首先,图片压缩是减少上传时间和服务器存储空间的关键步骤。`mui`提供了一种方法来实现这个功能,通常...

    WEB前端大图片压缩并上传例子

    5. **导出压缩图片**:调用`toDataURL()`方法,将Canvas上的内容转换为新的Data URL,这就是压缩后的图片。 6. **上传图片**:最后,将这个压缩后的Data URL作为formData的一部分,通过Ajax发送到服务器进行存储或...

Global site tag (gtag.js) - Google Analytics