当前位置:首页 > 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方向问题,可能需要额外处理
  • 服务器端需配置合适的上传大小限制

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

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

相关文章

vue实现图片查看

vue实现图片查看

实现图片查看功能 在Vue中实现图片查看功能可以通过多种方式完成,常见的有使用原生HTML5的<dialog>元素、第三方组件库(如Element UI、Vant等)或专用插件(如view…

vue实现上传表格

vue实现上传表格

Vue实现上传表格的方法 使用Element UI上传组件 Element UI提供了el-upload组件,可以方便地实现文件上传功能。需要安装Element UI并引入相关组件。 安装Eleme…

vue实现图片加载

vue实现图片加载

Vue 实现图片加载的方法 在 Vue 中实现图片加载可以通过多种方式,以下是一些常见的方法: 使用 v-bind 绑定图片路径 通过 v-bind 动态绑定图片路径,可以灵活地加载本地或远程图片。…

js实现图片移动

js实现图片移动

使用CSS和JavaScript实现图片移动 方法一:使用CSS动画结合JavaScript控制 通过CSS定义动画关键帧,JavaScript动态添加或移除动画类。 /* CSS部分 */ .m…

js实现保存图片

js实现保存图片

使用Canvas绘制并保存图片 在HTML中创建一个Canvas元素,通过JavaScript绘制内容后转换为图片并保存。Canvas的toDataURL方法可将画布内容转为Base64编码的图片数据…

vue实现图片拖动

vue实现图片拖动

Vue 实现图片拖动的步骤 使用 HTML5 拖放 API 在 Vue 中实现图片拖动可以利用 HTML5 的拖放 API。通过 draggable 属性设置元素可拖动,监听 dragstart、dr…