当前位置:首页 > VUE

vue实现图片压缩上传

2026-01-20 13:25:34VUE

实现图片压缩上传的方法

使用HTML5的Canvas进行压缩

通过Canvas的drawImagetoDataURL方法实现图片压缩。创建一个input元素用于选择图片,监听change事件处理压缩逻辑。

<input type="file" accept="image/*" @change="handleImageUpload" />
methods: {
  handleImageUpload(event) {
    const file = event.target.files[0];
    if (!file) return;

    const reader = new FileReader();
    reader.onload = (e) => {
      const img = new Image();
      img.onload = () => {
        const canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');

        // 设置压缩后的宽度(保持比例)
        const MAX_WIDTH = 800;
        const scale = MAX_WIDTH / img.width;
        canvas.width = MAX_WIDTH;
        canvas.height = img.height * scale;

        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
        canvas.toBlob((blob) => {
          this.uploadCompressedImage(blob);
        }, 'image/jpeg', 0.7); // 质量参数0.7(0-1)
      };
      img.src = e.target.result;
    };
    reader.readAsDataURL(file);
  }
}

使用第三方库(如compressorjs)

安装compressorjs库可以简化压缩流程:

vue实现图片压缩上传

npm install compressorjs

在Vue组件中引入并使用:

vue实现图片压缩上传

import Compressor from 'compressorjs';

methods: {
  compressImage(file) {
    new Compressor(file, {
      quality: 0.6,
      maxWidth: 1024,
      success: (compressedFile) => {
        this.uploadCompressedImage(compressedFile);
      },
      error: (err) => {
        console.error('压缩失败:', err);
      }
    });
  }
}

上传压缩后的图片

通过FormData将压缩后的图片发送到服务器:

uploadCompressedImage(blob) {
  const formData = new FormData();
  formData.append('file', blob, 'compressed.jpg');

  axios.post('/api/upload', formData, {
    headers: { 'Content-Type': 'multipart/form-data' }
  }).then(response => {
    console.log('上传成功', response.data);
  }).catch(error => {
    console.error('上传失败', error);
  });
}

显示上传进度

添加进度条反馈用户体验:

axios.post('/api/upload', formData, {
  headers: { 'Content-Type': 'multipart/form-data' },
  onUploadProgress: (progressEvent) => {
    const percent = Math.round(
      (progressEvent.loaded * 100) / progressEvent.total
    );
    console.log(`上传进度: ${percent}%`);
  }
})

注意事项

  • 压缩比例(quality)需根据实际需求调整,过高可能失去压缩意义,过低可能影响图片质量。
  • 大图建议限制分辨率(如maxWidth),避免移动端内存问题。
  • 服务器需配置接收二进制文件(如Express需使用multer中间件)。

标签: 上传图片
分享给朋友:

相关文章

h5怎么实现上传视频

h5怎么实现上传视频

使用HTML5实现视频上传 HTML5提供了<input type="file">元素用于文件上传,结合<video>标签可以实现视频上传和预览功能。 <input t…

react如何添加图片

react如何添加图片

在React中添加图片的方法 使用import导入本地图片 将图片文件放在项目目录中(如src/assets),通过import语句引入后作为src属性值: import logo from './…

vue实现图片取色

vue实现图片取色

Vue 实现图片取色功能 在 Vue 中实现图片取色功能,可以通过 Canvas API 获取图片像素数据,并提取颜色信息。以下是具体实现方法: 使用 Canvas 获取图片颜色数据 创建 Canv…

js实现图片的懒加载

js实现图片的懒加载

实现图片懒加载的基本原理 懒加载的核心思想是延迟加载非视口内的图片,当用户滚动页面时再动态加载即将进入视口的图片资源。这能显著减少页面初始加载时的网络请求和带宽消耗。 Intersection Ob…

vue实现上传视频

vue实现上传视频

使用 <input type="file"> 实现基础上传 通过 HTML 原生文件选择控件获取视频文件,结合 Vue 处理上传逻辑。 <template> <…

vue实现图片识别

vue实现图片识别

Vue 实现图片识别的方法 使用 Tesseract.js 进行 OCR 识别 Tesseract.js 是一个基于 JavaScript 的 OCR 库,可以在浏览器中直接识别图片中的文字。在 Vu…