当前位置:首页 > VUE

vue实现图片压缩上传

2026-02-21 05:24:14VUE

实现图片压缩上传的方法

在Vue中实现图片压缩上传通常涉及以下步骤,结合前端压缩库和文件上传逻辑:

使用canvas压缩图片

安装依赖库(如compressorjs):

npm install compressorjs

在Vue组件中实现压缩逻辑:

<template>
  <input type="file" @change="handleImageUpload" accept="image/*">
</template>

<script>
import Compressor from 'compressorjs';

export default {
  methods: {
    handleImageUpload(e) {
      const file = e.target.files[0];
      if (!file) return;

      new Compressor(file, {
        quality: 0.6,
        maxWidth: 800,
        maxHeight: 800,
        success(result) {
          const formData = new FormData();
          formData.append('file', result, result.name);

          // 上传到服务器
          axios.post('/upload', formData, {
            headers: { 'Content-Type': 'multipart/form-data' }
          }).then(response => {
            console.log('上传成功', response);
          });
        },
        error(err) {
          console.error('压缩失败:', err);
        }
      });
    }
  }
};
</script>

纯前端实现压缩

若不使用第三方库,可通过canvas API实现基础压缩:

compressImage(file) {
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = (event) => {
      const img = new Image();
      img.src = event.target.result;
      img.onload = () => {
        const canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');

        // 设置压缩尺寸
        const MAX_WIDTH = 800;
        const MAX_HEIGHT = 800;
        let width = img.width;
        let height = img.height;

        if (width > height) {
          if (width > MAX_WIDTH) {
            height *= MAX_WIDTH / width;
            width = MAX_WIDTH;
          }
        } else {
          if (height > MAX_HEIGHT) {
            width *= MAX_HEIGHT / height;
            height = MAX_HEIGHT;
          }
        }

        canvas.width = width;
        canvas.height = height;
        ctx.drawImage(img, 0, 0, width, height);

        canvas.toBlob((blob) => {
          resolve(new File([blob], file.name, {
            type: 'image/jpeg',
            lastModified: Date.now()
          }));
        }, 'image/jpeg', 0.7);
      };
    };
  });
}

上传至服务器

压缩后的文件可通过FormData上传:

vue实现图片压缩上传

async uploadFile() {
  const compressedFile = await this.compressImage(this.selectedFile);
  const formData = new FormData();
  formData.append('file', compressedFile);

  try {
    const response = await axios.post('/api/upload', formData);
    console.log('上传结果:', response.data);
  } catch (error) {
    console.error('上传失败:', error);
  }
}

注意事项

  • 压缩比例(quality)建议设置在0.6-0.8之间平衡质量和文件大小
  • 大图片应限制最大宽高防止内存问题
  • 移动端需注意EXIF方向问题,可能需要额外处理
  • 服务器端需配置合适的上传大小限制

以上方法可根据实际需求选择实现,第三方库方案更简单可靠,而纯前端方案提供更多自定义控制。

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

相关文章

vue2实现图片懒加载

vue2实现图片懒加载

实现图片懒加载的方法 在Vue2中实现图片懒加载可以通过以下方法完成,核心原理是监听图片是否进入可视区域,再动态加载图片资源。 使用IntersectionObserver API Intersec…

vue实现分段上传

vue实现分段上传

实现分段上传的基本思路 分段上传(分片上传)是将大文件分割成多个小块分别上传,最后在服务器合并的技术。这种方式能提高上传稳定性、支持断点续传,并减轻服务器压力。 前端实现步骤 安装依赖 需要axio…

vue实现放大图片

vue实现放大图片

实现图片放大功能的方法 在Vue中实现图片放大功能,可以通过多种方式实现。以下是几种常见的方法: 使用CSS transform属性 通过CSS的transform: scale()属性实现图片放…

react如何引入图片

react如何引入图片

在React中引入图片的方法 使用import直接引入 将图片文件放在项目src目录下(如src/images),通过ES6的import语法引入: import logo from './imag…

vue 怎么实现上传

vue 怎么实现上传

Vue 实现文件上传的方法 使用原生 HTML5 文件上传 通过 <input type="file"> 元素结合 Vue 的数据绑定实现基础文件上传功能。 <template&g…

vue实现图片切换

vue实现图片切换

实现图片切换的方法 使用v-for和v-bind动态绑定图片 通过v-for循环渲染图片列表,结合v-bind动态绑定图片路径,实现切换效果。 <template> <div&…