当前位置:首页 > 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库可以简化压缩流程:

npm install compressorjs

在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 实现上传

Vue 实现文件上传 使用 Vue 实现文件上传可以通过原生 HTML 的 <input type="file"> 或第三方库(如 axios、vue-upload-component)完…

css图片按钮制作

css图片按钮制作

使用纯CSS创建图片按钮 通过CSS的background-image属性可以轻松将图片设置为按钮背景。关键点在于设置合适的尺寸、去除默认边框并添加交互状态: .image-btn { wid…

网页制作css图片切换

网页制作css图片切换

CSS图片切换的实现方法 使用CSS实现图片切换可以通过多种方式完成,以下是几种常见的方法: 纯CSS轮播图 通过CSS动画和关键帧实现自动轮播效果。定义一个容器,内部放置多个图片,利用ani…

css网页制作漂浮图片

css网页制作漂浮图片

使用CSS实现漂浮图片效果 通过CSS的animation属性和@keyframes规则可以轻松实现图片漂浮效果。以下是几种常见实现方式: 基础漂浮动画 通过关键帧定义图片的垂直移动,模拟漂浮感:…

vue实现文档上传

vue实现文档上传

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

vue实现拖动图片验证

vue实现拖动图片验证

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