当前位置:首页 > 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上传:

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实现图片取色

Vue 实现图片取色功能 使用 Canvas API 提取颜色 在 Vue 项目中,可以通过 Canvas API 实现图片取色功能。创建一个组件,利用 ref 获取图片元素并绘制到 Canvas 上…

vue实现拖动图片验证

vue实现拖动图片验证

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

vue2实现图片懒加载

vue2实现图片懒加载

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

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document…

vue实现图片闪烁

vue实现图片闪烁

实现图片闪烁效果的方法 在Vue中实现图片闪烁效果可以通过CSS动画或JavaScript动态控制样式。以下是几种常见方法: CSS动画实现 通过@keyframes定义闪烁动画,并应用到图片元…

php实现视频上传

php实现视频上传

视频上传功能实现 使用PHP实现视频上传功能需要处理文件接收、验证、存储等步骤。以下是具体实现方法: 创建HTML表单 前端表单需要设置enctype="multipart/form-data"…