当前位置: 首页 > 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.dtcms.com/a/265454.html

相关文章:

  • Euler2203安装.NetCore6.0环境操作步骤
  • python安装虚拟环境
  • Python 物联网(IoT)与边缘计算开发实战(1)
  • 优雅草蜻蜓R实时音视频会议系统云原生私有化部署方案深度解析-优雅草卓伊凡|贝贝|clam|麻子|夜辰
  • Docker 容器资源限制
  • 9.Docker的容器数据卷使用(挂载)
  • ATE FT ChangeKit学习总结-20250630
  • 网络的封包与拆包
  • 基于Java的企业项目管理与协作系统设计与实现
  • Dataset Distillation by Matching Training Trajectories(2203.11932)
  • Eclipse主题拓展
  • mysql索引的底层原理是什么?如何回答?
  • Go语言的sync.Once和sync.Cond
  • Redis 源码 tar 包安装 Redis 哨兵模式(Sentinel)
  • Go调度器的抢占机制:从协作式到异步抢占的演进之路|Go语言进阶(7)
  • 价值实证:数字化转型标杆案例深度解析
  • 网络地址与子网划分:一次性搞清 CIDR、VLSM 和子网掩码
  • 分类树查询性能优化:从 2 秒到 0.1 秒的技术蜕变之路
  • 如何在 IDEA 中设置类路径
  • 探索具身智能新高度——机器人在数据收集与学习策略中的优势和机会
  • Objective-C UI事件处理全解析
  • c++中的绑定器
  • 如何使用AI改进论文写作 ---- 引言篇(2)
  • 设计模式系列(10):结构型模式 - 桥接模式(Bridge)
  • AutoMedPrompt的技术,自动优化提示词
  • 【小技巧】Python + PyCharm 小智AI配置MCP接入点使用说明(内测)( PyInstaller打包成 .exe 可执行文件)
  • Spring Boot + 本地部署大模型实现:基于 Ollama 的集成实践
  • Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
  • 【Note】《深入理解Linux内核》Chapter 9 :深入理解 Linux 内核中的进程地址空间管理机制
  • MySQL数据库----DML语句