vue js实现文件上传压缩优化处理

news2025/7/6 18:47:00

vue js实现文件上传压缩优化处理

两种方法 :

  • 第1种是借助canvas的封装的文件压缩上传
  • 第2种(扩展方法)使用compressorjs第三方插件实现

目录

vue js实现文件上传压缩优化处理

 借助canvas的封装的文件压缩上传

1.新建imgUpload.js

2.全局引入封装的方法

3.页面中使用

 使用compressorjs第三方插件实现

1.compressorjs安装

2.方法封装

2.页面使用

3.头像上传处理


下面来详细介绍两种方法:

 借助canvas的封装的文件压缩上传

封装之前,先要对canvas相关的方法有所了解 

<canvas>简单实例如下:

<canvas id="myCanvas" width="200" height="100"></canvas>

注意: 标签通常需要指定一个id属性 (或者其他), width 和 height 属性定义的画布的大小.

使用 style 属性来添加边框:

<canvas id="myCanvas" width="200" height="100"
style="border:1px solid #000000;">
</canvas>

1.新建imgUpload.js

 将base64转换为file文件

const dataURLtoFile = (dataurl, filename) => { 
    let arr = dataurl.split(',')
    let mime = arr[0].match(/:(.*?);/)[1]
    let bstr = atob(arr[1])
    let n = bstr.length
    let u8arr = new Uint8Array(n)
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n)
    }
    return new File([u8arr], filename, { type: mime })
};

使用canvas的方法实现(拓展)

drawImage() 方法在画布上绘制画布。

在画布上定位图像:

context.drawImage(img,x,y);

在画布上定位图像,并规定图像的宽度和高度:剪切图像,并在画布上定位被剪切的部分:

context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);

canvas的toDataURL()方法是返回一个包含图片展示的 数据URL。可以使用type 参数其类型,默认为 png 格式 

canvas.toDataURL(type, option);

option表示0到1之间的取值,选定图片的质量,默认值是0.92 

const imgZip = (file) => {
    let imgZipStatus = new Promise((resolve, reject) => {
        let canvas = document.createElement("canvas"); // 创建Canvas对象(画布)
        let context = canvas.getContext("2d");
        let img = new Image();
        img.src = file.content; // 指定图片的DataURL(图片的base64编码数据)
        var Orientation = '';
        img.onload = () => {
            // canvas.width = 400;
            // canvas.height = 300;
            canvas.width = img.width;
            canvas.height = img.height;
            context.drawImage(img, 0, 0, canvas.width, canvas.height);         
            file.content = canvas.toDataURL(file.file.type, 0.5); // 0.92为默认压缩质量
            
            let files = dataURLtoFile(file.content, file.file.name);
            resolve(files)
        }
    })
    return imgZipStatus;
};

导出方法imgZip

export {
    imgZip
}

2.全局引入封装的方法

main.js

// 引入imgUpload方法
import * as imgUpload from "./utils/imgUpload"
Vue.prototype.$imgUpload = imgUpload;

3.页面中使用

这里使用了vant ui框架,实现的头像上传,如果用原生的input file方法也是一样的使用方式

 

<van-uploader :after-read="afterCard" :before-read="beforeRead" accept="image/*" class="arrart"
                :max-size="10240 * 1024" @oversize="onOversize" ref="uploadFile">
                <!-- <div class="loadingWrap" v-show="personCardloading">
                  <van-loading class="colorCom uploadText" color="#fff" size="24px">{{uploadText}}</van-loading>
                </div> -->
                <van-image class="iconImg" round :src="Personal.iconUrl?$baseImgUrl+Personal.iconUrl:require('../../assets/img/touciang.png')" width="64" height="64" />
              </van-uploader>

限制上传数量

通过 max-count 属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域。

 

禁用文件上传

通过 disabled 属性禁用文件上传。

<van-uploader disabled />

 限制上传大小图片

// 限制上传大小图片
    onOversize(file) {
      console.log(file, "file");
      this.$toast("文件大小不能超过 10M");
    },

上传之前的图片验证 

    // 上传之前的图片验证
    beforeRead(file) {
      console.log(file, "file,123");
      if (this.$utils.isImage(file.name)) {
        return true;
      } else {
        this.$toast("请上传图片格式");
      }
    },

 

afterCard方法,当提交了头像,先进行压缩处理,再去把formData文件流 作为参数调用接口,

获取到后台返回的图片路径,再调用更新头像接口,把获取的数据赋值显示头像的img.

// 头像上传
    afterCard(file) {
      this.$imgUpload.imgZip(file).then(resData => {
        const formData = new FormData();
        formData.append("file", resData);
        // 请求接口上传图片到服务器
        uploadImg(formData).then(res => {
          console.log(res, "图片上传");
          if (res.code == 200) {
            console.log(res.data,"res.data")
            let params = {
              bbsIconUrl: res.data,
              userId: this.id
            };
            compileUserInfo(params)
              .then(resImg => {
                console.log(resImg, "resImg");
                if (resImg.code == 200) {
                  this.Personal.iconUrl =res.data;
                  
                  this.$toast("头像修改成功");
                } else {
                  this.$toast(resImg.msg);
                }
              })
              .catch(error => {});
          } else {
            this.$toast(res.msg);
          }
        });
      });
    },

 

 如果这里使用原生的input file,可按照如下操作

示例:

<input type="file" id="file" accept="image/*"> 
import axios from 'axios';
 
document.getElementById('file').addEventListener('change', (e) => {
  const file = e.target.files[0];
 
  if (!file) {
    return;
  }
  this.$imgUpload.imgZip(file).then(resData => {
        const formData = new FormData();
        formData.append("file", resData);

        //接口调用
        axios.post('/upload', formData).then((res) => {
            console.log('Upload success');
        });
  })

});

 使用compressorjs第三方插件实现

compressorjs 是一个开源的图片处理库,提供了图片压缩、图片旋转等能力

语法:

new Compressor(file[, options]) 

 

1.compressorjs安装


npm install compressorjs --save

2.方法封装

ImageCompressor.js

quality:quality || 0.6, //压缩质量,图片压缩比 0-1

import Compressor from 'compressorjs';
export default function ImageCompressor(file, backType, quality) {
    return new Promise((resolve, reject) => {
        new Compressor(file, {
			quality:quality || 0.6, //压缩质量
			success(result) {
                if (!backType || backType == 'blob') {
                    resolve(result)
                } else if (backType == 'file') {
                    resolve(file)
                } else {
                    resolve(file)
                }
				// resolve(result);
			},
			error(err) {
                console.log("图片压缩失败");
				reject(err);
			}
		})
    })
}

 此插件还能解决ios移动端拍照图片翻转90度问题

2.页面使用

import ImageCompressor from '@/utils/ImageCompressor'

3.头像上传处理

这里记得使用 async await,注意使用的file取值,与第一种的方法有所不同

 // 头像上传
    async afterCard(file) {
        let newFile = await ImageCompressor(file.file, 'file', 0.6); //图片压缩
        const formData = new FormData();
        formData.append("file", newFile);
        uploadImg(formData).then(res => {
          if (res.code == 200) {
            this.centerInfo.iconUrl = res.data;
            let params = {
              iconUrl: res.data,
              id: this.id,
              loginType: this.loginType
            };
            updateMineIconUrl(params)
              .then(resImg => {
                console.log(resImg, "resImg");
                if (resImg.code == 200) {
               
                  this.$toast("头像修改成功");
                } else {
                  this.$toast(res.msg);
                }
              })
              .catch(error => {});
          } else {
            this.$toast(res.msg);
          }
        });
    
    },

如果这里使用原生的input file,可按照如下操作

示例:

<input type="file" id="file" accept="image/*"> 
import axios from 'axios';
import Compressor from 'compressorjs';
 
document.getElementById('file').addEventListener('change', (e) => {
  const file = e.target.files[0];
 
  if (!file) {
    return;
  }
 
  new Compressor(file, {
    quality: 0.6,
 
    success(result) {
      const formData = new FormData();
 
      formData.append('file', result, result.name);
        //接口调用
      axios.post('/upload', formData).then(() => {
        console.log('Upload success');
      });
    },
    error(err) {
      console.log(err.message);
    },
  });
  
});

 

⭐️⭐️⭐️  作者:船长在船上
🚩🚩🚩  主页:来访地址船长在船上的博客
🔨🔨🔨  简介:CSDN前端领域博客专家,CSDN前端领域优质创作者,资深前端开发工程师,专注web前端领域开发,在CSDN分享工作中遇到的问题以及问题解决方法和对项目开发的实际案例总结以及新技术的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高清免费壁纸网站推荐

本期内容&#xff0c;为大家整理了6个相当不错的免费壁纸网站&#xff0c;访问量极大、活跃度极高。 无需登录、注册&#xff0c;打开右键就可以下载&#xff0c;而且壁纸图片的尺寸大小&#xff0c;可以选择&#xff0c;从手机、平板、再到电脑壁纸&#xff0c;全部都是高清。…

Windows/Ubuntu安装frida和objection

​Windows/Ubuntu安装frida和objection 1.Windows环境使用管理员权限安装frida,Ubuntu使用普通或Root权限安装均可 https://github.com/frida/frida (1).安装frida(Python2.7.8及以上版本) pip install numpy matplotlib -i https://mirrors.aliyun.com/pypi/simplepip insta…

imx6ull pro BSP 工具链

BSP&#xff0c;Board Support Package&#xff0c;指板级支持包&#xff0c;是构建嵌入式操作系统所 需的引导程序(Bootload)、内核(Kernel)、根文件系统(Rootfs)和工具链 (Toolchain)。 每种开发板的 BSP 都不一样&#xff0c;并且这些源码都非常庞大。我们把这些源码都 放在…

BI-SQL丨JOB

JOB 在SQL Server中&#xff0c;JOB属于常用功能&#xff0c;我们经常需要通过JOB来执行一些定时的作业任务&#xff0c;例如数据备份、存储过程、SSIS任务、SSAS刷新等等。 通常情况下&#xff0c;我们都是在SSMS中对JOB进行创建、删除、维护等任务的。 前置条件 使用JOB功…

基于Mxnet实现实例分割-MaskRCNN【附部分源码】

文章目录前言一、什么是实例分割二、数据集的准备1.数据集标注2.VOC数据集转COCO数据集三、基于Mxnet搭建MaskRCNN1.引入库2.CPU/GPU配置3.获取训练的dataset1.coco数据集2.自定义数据集4.获取类别标签5.模型构建6.数据迭代器7.模型训练1.优化器设置2.loss计算3.acc计算4.循环训…

堆 堆排序 TopK问题

堆一&#xff0c;堆的相关函数接口实现1&#xff0c;堆的初始化2&#xff0c;堆的销毁3&#xff0c;插入4&#xff0c;向上调整5&#xff0c;删除6&#xff0c;向下调整7&#xff0c;建堆8&#xff0c;取堆顶9&#xff0c;判空10&#xff0c;堆的大小二&#xff0c;向上建堆与向…

用DIV+CSS技术设计的鲜花网站(web前端网页制作课作业)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

(人工智能的数学基础)第一章特征向量与矩阵分析——第一节:向量、向量空间和线性相关性

文章目录一&#xff1a;标量和向量&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;坐标系中的向量表示二&#xff1a;向量运算&#xff08;1&#xff09;加减与数乘&#xff08;2&#xff09;向量内积A&#xff1a;为什么需要向量内积B&#xff1a;向量内积C&…

Linux之分区【详细总结】

目录分区介绍分区查看指令lsblk ![请添加图片描述](https://img-blog.csdnimg.cn/d7ea5468d719433ea6ee4ab0eb145770.png)lsblk -f挂载案例分五部分组成 虚拟机添加硬盘 分区 格式化 挂载 设置自动挂载虚拟机增加硬盘查看整个系统磁盘情况查询查看整个目录磁盘占用情况磁盘情况…

初识 MySQL HeatWave

MySQL 作为全球最欢迎的数据库&#xff0c;已在交易场景叱咤风云多年。在 2020 年底&#xff0c;OCI&#xff08;Oracle Cloud Infrastructure&#xff09;推出了一个黑科技插件&#xff0c;它弥补了 MySQL 在分析场景的短板&#xff0c;Oracle 官方称它比 Aurora 快 1400 倍&a…

GIS 分析常用的 7 个地理处理工具

以下这7 个地理处理工具总是在 GIS 大师的热门列表中名列前茅&#xff0c;似乎如我们的精神食粮&#xff0c;像面包和黄油一样。从裁剪到缓冲&#xff0c;您将学习处理GIS 数据的基础知识&#xff0c;以便更好地了解如何将这些 GIS 工具用于实际应用程序。在ArcGIS 和 QGIS等 G…

Gradle学习笔记之第一个Gradle项目

文章目录前言创建gradle项目gradle目录结构gradle常用命令修改maven仓库地址启用init.gradle的方法关于gradle仓库gradle包装器前言 Gradle是Android构建的基本工具&#xff0c;因此作为Android研发&#xff0c;有必要系统地学一学Gradle&#xff0c;环境windows就可以。 创建…

学生个人网页模板 学生个人网页设计作品 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计代做

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

git原理和命令以及工具

原理 工作区、暂存区和版本库 分支结构 origin 对象模型 命令 配置 $ git config --global user.name “John Doe” $ git config --global user.email johndoeexample.com 针对特定项目使用不同的用户名称与邮件地址时&#xff0c;可以在那个项目目录下运行没有 --globa…

52、训练paddleSeg模型,部署自己的模型到OAK相机上

基本思想&#xff1a;简单记录一下训练过程&#xff0c;数据集在coco基础上进行&#xff0c;进行筛选出杯子的数据集&#xff0c;然后进行训练&#xff0c;比较简单&#xff0c; 从coco数据集中筛选出杯子的数据集&#xff0c;然后在labelme数据集的基础上&#xff0c;转成padd…

学生个人网页设计作品:基于HTML+CSS+JavaScript实现摄影艺术网站 DIV布局简单的摄影主题网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

NATAPP 访问vue-cli启动的项目

由于疫情原因&#xff0c;最近又静默居家办公了&#xff0c;由于项目需要&#xff0c;不得不再使用一下natapp了&#xff0c;这个东西两年前就用过了&#xff0c;不过以前访问的不是vue-cli项目&#xff0c;特此记录一下&#xff0c;因为这里有个坑&#xff0c;上午搞了半天没搞…

APP逆向案例之(二)对加固APP进行分析和破解

说明&#xff1a;对加固APP进行分析和破解&#xff0c;对发现新版本提示关掉 1、先对APP窗口类行进HOOK&#xff0c;确定窗口提示用的是那个类。 android hooking watch class android.app.AlertDialog 2、发现一个非常明显的函数 setCancelable objection -g com.hello.qq…

50个html+css+js项目小练习(二:动画的倒计时效果)

2.animated-navigation 实现效果&#xff1a; 倒计时321后显示go数字依次从x轴负方向&#xff0c;顺时针倒下去 xy第一个数&#xff08;0,y&#xff09;—>&#xff08;-x,0&#xff09; 第一个数字倒下去的同时&#xff0c;第二个数从x轴正方向升起 第二个数&#xff08;x…

1. 开篇:既简单又复杂的基础框架

同样的基础但不简单 之前在写 《从 0 开始深入学习 Spring》 小册时&#xff0c;阿熊提到过一件事&#xff1a;学习 JavaEE 开发的第一个框架&#xff0c;大多数是推荐 MyBatis 的&#xff0c;因为它相对简单&#xff0c;学习起来也相对轻松。不过不要因为 MyBatis 入门简单&a…