当前位置:首页 > 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中间件)。

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

相关文章

vue实现文档上传

vue实现文档上传

Vue 实现文档上传的方法 使用原生 HTML 表单和 Vue 处理文件上传 在 Vue 中可以通过原生 HTML 的 <input type="file"> 元素结合 Vue 的数据绑定…

vue实现拖动图片验证

vue实现拖动图片验证

Vue 实现拖动图片验证功能 核心思路 拖动图片验证通常需要用户将图片拖动到指定区域或按正确顺序排列。实现时需要处理拖拽事件、验证逻辑和视觉反馈。 实现步骤 1. 基础组件结构 <templ…

vue实现图片编辑

vue实现图片编辑

Vue实现图片编辑的方法 使用第三方库vue-cropper 安装vue-cropper库: npm install vue-cropperjs 在Vue组件中使用: <template&g…

vue图片实现旋转

vue图片实现旋转

使用 CSS transform 实现图片旋转 在 Vue 中可以通过 CSS 的 transform 属性实现图片旋转效果。创建一个数据属性控制旋转角度,通过绑定样式动态更新。 <t…

vue 实现图片切换

vue 实现图片切换

实现图片切换的基本思路 在Vue中实现图片切换通常涉及数据绑定、事件处理和动态样式。核心是通过维护一个当前图片索引的状态,利用Vue的响应式特性更新显示的图片。 数据准备与绑定 定义一个数组存储图片…

js 实现图片 放大

js 实现图片 放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性可以实现图片的平滑放大效果。结合 JavaScript 监听鼠标事件控制放大状态: con…