讲师中心 微信公众号
AI工具推荐 视频效率加速

js如何实现一张图片的压缩与上传(附代码)

千枫吖_5821

千枫吖_5821

发布时间:2018-08-14 16:52:00

|

2323人浏览过

|

来源于php中文网

原创

本篇文章给大家带来的内容是关于js如何实现一张图片的压缩与上传(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

*vue+webpack环境,这里的that指到vue实例

<input type="file" name="file" accept="image/*" @change="selectImgs" ref="file" />

一、图片压缩

    /*
        file:文件(类型是图片格式),
        obj:文件压缩后对象width, height, quality(0-1)
        callback:容器或者回调函数
    */
    photoCompress(file,obj,callback){
        let that=this;
        let ready=new FileReader();
        /*开始读取指定File对象中的内容. 读取操作完成时,返回一个URL格式的字符串.*/
        ready.readAsDataURL(file);
        ready.onload=function(){
            let re=this.result;
            that.canvasDataURL(re,obj,callback)  //开始压缩
        }
    },
/*利用canvas数据化图片进行压缩*/
    canvasDataURL(path, obj, callback){
        
        let img = new Image();
        img.src = path;
        img.onload = function(){
            let that = this;   //指到img
            // 默认按比例压缩
            let w = that.width,
                h = that.height,
                scale = w / h;
            w = obj.width || w;
            h = obj.height || (w / scale);
            let quality = 0.7;  // 默认图片质量为0.7
            //生成canvas
            let canvas = document.createElement('canvas');
            let ctx = canvas.getContext('2d');
            // 创建属性节点
            let anw = document.createAttribute("width");
            anw.nodeValue = w;
            let 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值越小,所绘制出的图像越模糊
            let base64 = canvas.toDataURL('image/jpeg', quality);
            // 回调函数返回base64的值
            callback(base64);
        }
    },

二、base64转文件

这里后台接口不支持base64,根据实际接口情况使用

    /*这里转为blob*/
    convertBase64UrlToBlob(urlData){
        let 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});
    },

三、上传图片

    selectImgs(e) {    //选择文件后执行
      let that=this
      let fileObj=e.target.files[0]  //获取file
      //console.log(fileObj)
      var form = new FormData();  // 创建FormData 对象
      if(fileObj.size/1024 > 1025) { //文件大于1M,进行压缩上传
          that.photoCompress(fileObj, {   //调用压缩图片方法
              quality: 0.2
          }, function(base64Codes){
              //console.log("压缩后:" + base.length / 1024 + " " + base);
              let bl = that.convertBase64UrlToBlob(base64Codes);
              //console.log(bl)
              form.append("file", bl, "file_"+Date.parse(new Date())+".jpg"); // 文件对象
              that.imgRequest(form);  //请求图片上传接口
          });
      }else{ //小于等于1M 原图上传
          form.append("file", fileObj); // 文件对象
          that.imgRequest(form);   //请求图片上传接口
      }
    },
     /*图片上传接口*/
    imgRequest(param){
      PostSaveImg(    //封装的ajax(axios)方法
          param
      ).then(data => {
          if (data.status === 200 || data.status === 304){
            let item={
              path:this.imgpath+data.data[0].path,
            }
            let jsonitem={
              jlid:this.jlid,
              path:data.data[0].path,
              xxdm:this.xxdm,
            }
            this.imglistJson.push(jsonitem)
            this.imglist.push(item)
          }else{
             Toast({    //封装的提示方法
                message: '图片上传失败',
                position: 'middle',
                duration: 2000
              })
          } 
      })
      
      /*原生请求*/
      // const xhr = new XMLHttpRequest()   
      // xhr.open('POST', HOSTMOBILE+'api/mobile/xcjg/sctp', true)   //接口地址
      // xhr.send(param)
      //  xhr.onload = () => {
      //   if (xhr.status === 200 || xhr.status === 304) {
      //     let datas = JSON.parse(xhr.responseText)
      //     console.log('response: ', datas)
      //   } else {
      //     alert(`${xhr.status} 请求错误!`)
      //   }
      // }
      
    },

相关推荐:

reac如何t实现更换皮肤颜色的功能

js中data对象的详细用法介绍(附代码)

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3208

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5189

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3849

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

486

2026.01.19

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4696

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1395

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1838

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

10243

2023.08.17

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn