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; // 降级处理:上传原文件
  }

}

相关推荐
IT_陈寒4 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
To_OC4 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
DigitalOcean6 小时前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
星始流年6 小时前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
李惟6 小时前
开源本地通信库,纯客户端 RPC,像聊天一样通信
前端
YAwu116 小时前
深入解析 React 炫彩鼠标跟随标题组件:从坐标定位到动画性能
前端·react.js
GuWenyue6 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
OpenTiny社区6 小时前
🎨 看完 GenUI SDK 源码我悟了!
前端·vue.js·github
叁两6 小时前
前端转型AI Agent该如何学习?(前置篇)
前端·人工智能·node.js
何时梦醒6 小时前
深入理解递归与快速排序 —— 从基础入门到手写实现
前端·javascript