当前位置: 首页 > news >正文

vue2+elementui使用compressorjs压缩上传的图片

 首先是npm install compressorjs

然后新建一个compressorjs.js的文件

import Compressor from "compressorjs";// 默认压缩配置
const DEFAULT_COMPRESS_OPTIONS = {quality: 0.6, // 默认压缩质量 (0-1)maxWidth: 1920, // 最大宽度maxHeight: 1080, // 最大高度convertSize: 5 * 1024 * 1024, // 超过5MB的图片转为WebP
};/*** 压缩图片文件* @param {File} file - 待压缩的图片文件* @param {Object} options - 压缩配置项* @returns {Promise<File>} 压缩后的文件*/
export function compressImage(file, options = {}) {return new Promise((resolve, reject) => {// 合并配置并限制最小压缩质量const mergedOptions = {...DEFAULT_COMPRESS_OPTIONS,...options,quality: Math.max(0.1,options.quality ?? DEFAULT_COMPRESS_OPTIONS.quality),maxWidth: Math.min(options.maxWidth ?? DEFAULT_COMPRESS_OPTIONS.maxWidth,8192),maxHeight: Math.min(options.maxHeight ?? DEFAULT_COMPRESS_OPTIONS.maxHeight,8192),};// 执行压缩new Compressor(file, {...mergedOptions,success(result) {if (!result) {return reject(new Error("Compression result is empty"));}resolve(new File([result], file.name, { type: result.type }));},error(err) {reject(err);},});});
}

 

具体的使用页面。只用在上传之前before-upload的函数中压缩就可以啦

<el-upload:before-upload="beforeUploadImg"
>
</el-upload>

 

import { compressImage } from "@/utils/imageCompress";async beforeUploadImg(file) {const fileSize = file.size / 1024 / 1024;let types = ["image/jpeg", "image/jpg", "image/png", "application/pdf"];const isImageOrPDF = types.includes(file.type);if (!isImageOrPDF) {this.$message.error("上传图片只能是 JPG/JPEG/PNG/PDF 格式!");return false;}try {// 压缩图片(仅处理大于5MB的图片)。当前你也可以不加这个限制就是压缩所有上传的图片if (fileSize > 5) {const compressedFile = await compressImage(file, {quality: fileSize > 10 ? 0.7 : 1,axWidth: Infinity, // 不限制宽度maxHeight: Infinity, // 不限制高度});return compressedFile; // 返回压缩后的文件}return file;} catch (err) {if (fileSize > 5) {this.$message({message: "上传图片大小超过限制",type: "warning",});return false;}console.error("压缩失败:", err);return file; // 降级处理:上传原文件}

}

 

http://www.lryc.cn/news/579620.html

相关文章:

  • 机器人“触摸”水果成熟度突破:SwishFormer模型与DIGIT视触觉传感器在HelloRobot上的水果检测应用
  • 从0到1解锁Element-Plus组件二次封装El-Dialog动态调用
  • Unity-Shader-几何着色器
  • 学习设计模式《十六》——策略模式
  • Linux 73 LAMP4
  • 离线迁移 Conda 环境到 Windows 服务器:用 conda-pack 摆脱硬路径限制
  • 从0开始学习R语言--Day37--CMH检验
  • VR 果蔬运输开启农业物流新变革
  • AI无标记动捕如何结合VR大空间技术打造沉浸式游戏体验
  • 从0到1实战!用Docker部署Qwerty Learner输入法的完整实践过程
  • https如何利用工具ssl证书;使用自己生成的证书
  • 创建 TransactionStatus
  • rabbitmq 与 Erlang 的版本对照表 win10 安装方法
  • Debian-10-standard用`networking`服务的`/etc/network/interfaces`配置文件设置多网卡多IPv6
  • 贝叶斯深度学习:赋予AI不确定性感知的认知革命
  • 日本IT|日本做后端开发需要具备什么技能开发经验?
  • 深入理解CSS中的BFC 与IFC , 布局的两大基础概念
  • Day50 预训练模型+CBAM模块
  • 【Python】图像识别的常用功能函数
  • golang json omitempty 标签研究
  • 服务器如何配置防火墙规则开放/关闭端口?
  • 数据库运维指导书
  • 74. 搜索二维矩阵
  • WPS 如何使用宏录制功能
  • Web 服务器架构选择深度解析
  • 【字节跳动】数据挖掘面试题0006:SVM(支持向量机)详细原理
  • LiteHub中间件之跨域访问CORS
  • 【ArcGISPro】基于Pro的Python环境进行Django简单开发Web
  • 队列和栈数据结构
  • RabbitMQ 高级特性之发送方确认