提升用户体验:Vue与compressor.js实现高效文件压缩

前言

上传文件是一个常见的需求,并且文件大小往往成为限制因素之一。为了提升用户体验和节省带宽消耗,上传时的文件压缩便显得格外重要。本文将介绍基于 Vue 框架和 compressor.js 的上传时文件压缩实现方法,通过在上传过程中对文件进行压缩,减小文件大小,提升上传速度,为用户创造更快捷、高效的上传体验。


安装

npm install image-compressor.js
yarn add image-compressor.js

compressor.js 常用的属性

属性描述
quality设置压缩图像的质量。值范围为0到1之间,其中0表示最低质量,1表示最高质量。
width指定压缩图像的目标宽度。可以使用像素或百分比来表示。
height指定压缩图像的目标高度。可以使用像素或百分比来表示。
minWidth限制压缩后的图像宽度的最小值。如果图像的宽度小于此值,将不会进行压缩。
minHeight限制压缩后的图像高度的最小值。如果图像的高度小于此值,将不会进行压缩。
maxWidth限制压缩后的图像宽度的最大值。如果图像的宽度超过此值,将会按比例缩小。
maxHeight限制压缩后的图像高度的最大值。如果图像的高度超过此值,将会按比例缩小。
convertSize确定是否在压缩时调整图像的大小。如果设置为true,将根据目标宽度和高度自动调整图像大小。
checkOrientation检查图像的方向信息,并根据需要进行自动旋转。

这些是 compressorjs 插件的一些常见属性,用于控制图像的压缩质量、尺寸和方向。你可以根据实际需求设置这些属性以获得想要的压缩效果。更多详细信息和属性,请参阅插件的官方文档


封装文件

import ImageCompressor from 'image-compressor.js';

export default function compressFile(file) {
  return new Promise((resolve, reject) => {
    const options = {
      success(result) {
        // 将压缩后的 Blob 转换为 File 对象(如果组件支持Blob则不用这一步)
        const compressedFile = new File([result], file.name, {
          type: file.type,
          lastModified: Date.now(),
        });
        resolve(compressedFile);
      },
      error(e) {
        reject(e);
      },
    };
    if (file.size > 5 * 1024 * 1024) {
      options.quality = 0.6; // 压缩质量
      options.convertSize = false;//不进行图像尺寸的调整
      options.checkOrientation = false; // 图片翻转,默认为false
    }
    new ImageCompressor(file, options);
  });
}


main.js

// 全局挂载
import compressFile from '@/utils/compressFile';
Vue.prototype.$compressFile = compressFile;

使用文件

<template>
  <div>
    <van-field label="照片">
      <template #input>
        <van-uploader :after-read="(file, detail) => clzpAfterRead(file, detail, 'xszzp')" v-model="cszp" :max-count="1" accept="image/*" />
      </template>
    </van-field>
  </div>
</template>

<script>
import { uploadFile } from "@/api/publicApi";
export default {
  data() {
    return {
      cszp: "",
    };
  },
  mounted() {},
  methods: {
    async clzpAfterRead(file, detail, name) {
      console.log(file.file.size, "未压缩大小");
      // 调用压缩图片的方法 this.$compressFile
      const compressedFile = await this.$compressFile(file.file);
      console.log(compressedFile.size, "压缩后大小");
      let formData = new FormData();
      formData.append("file", compressedFile);
      uploadFile(formData).then((res) => {
        // 执行操作
      });
    },
  },
};
</script>

实现过程

  1. 首先,需要在 Vue 组件中引入 ImageCompressor 库。可以通过 import ImageCompressor from 'image-compressor.js' 来实现;
  2. 下面是一个名为 compressFile 的函数。该函数接受一个文件(file)作为参数,并返回一个 Promise 对象,用于处理异步操作;
  3. compressFile 函数内部,创建了一个 options 对象,其中包含了成功(success)和错误(error)的回调函数;
  4. 如果文件的大小超过 5MB,则设置 options 对象的 quality 属性为 0.6,表示压缩质量为 60%
  5. 接下来,创建一个 ImageCompressor 实例,将文件和 options 对象作为参数传递给它。这将触发图片压缩的过程;
  6. 当压缩成功时,会调用 success 回调函数。在回调函数中,将压缩后的 Blob 对象转换为 File 对象,并使用 resolve 方法将其作为 Promise 的返回值返回;
  7. 当压缩出错时,会调用 error 回调函数。在回调函数中,使用 reject 方法将错误信息作为 Promise 的返回值返回;
  8. 接下来是一个 Vue 组件的模板代码。在模板中使用了 van-uploader 组件来实现图片的上传功能;
  9. methods 属性中定义了一个名为 clzpAfterRead 的方法。该方法会在图片上传成功后触发。参数 file 表示上传的文件,detail 表示上传的详细信息,name 表示上传文件的名称;
  10. clzpAfterRead 方法中,首先打印出上传文件的原始大小 file.file.size。接下来,调用 this.$compressFile 方法对上传的文件进行压缩;
  11. 使用 await 关键字等待压缩操作完成,并将压缩后的文件赋值给 compressedFile 变量;
  12. 打印出压缩后文件的大小 compressedFile.size
  13. 创建一个 FormData 对象 formData,并将压缩后的文件添加到 formData 中;
  14. 调用 uploadFile 方法,将 formData 作为参数传递给它,并使用 .then 方法处理上传成功后的响应;
  15. .then 方法中可以执行后续操作,例如更新界面或处理上传成功的数据。

总结起来,这段代码的实现思路是:通过 van-uploader 组件实现图片上传功能,在上传成功后调用 clzpAfterRead 方法,将上传的图片文件通过 image-compressor.js 库进行压缩,并将压缩后的文件再次上传到服务器。整个过程使用了 Vue 框架以及 Promise 对象来处理异步操作,以实现图片上传时压缩大小的功能。


实现效果

在这里插入图片描述

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要使用Vue和Element配合进行文件上传,可以使用Element的Upload组件。在上传之前,可以使用一些第三方库来压缩图片和视频。 对于图片,可以使用compressorjs或image-compressor库。这些库可以将图片压缩到指定的大小,并返回一个Blob对象,可用于上传。 对于视频,可以使用video-compressor库。该库支持将视频转换为不同的格式和分辨率,以减小文件大小。然后,也可以使用Blob对象上传视频。 下面是一个上传图片和视频的示例代码: ```vue <template> <div> <el-upload class="upload-demo" action="/upload" :on-success="handleSuccess" :before-upload="beforeUpload" :file-list="fileList" :limit="3" :on-exceed="handleExceed" multiple :show-file-list="false" > <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传不超过 3MB 的图片或视频,且最多上传 3 个文件</div> </el-upload> </div> </template> <script> import Compressor from 'compressorjs' import VideoCompressor from 'video-compressor' export default { data() { return { fileList: [] } }, methods: { beforeUpload(file) { // 判断文件类型 const type = file.type.split('/')[0] if (type === 'image') { // 压缩图片 return new Promise((resolve, reject) => { new Compressor(file, { quality: 0.6, // 压缩质量 success(result) { resolve(result) }, error(err) { reject(err) } }) }) } else if (type === 'video') { // 压缩视频 return new Promise((resolve, reject) => { const compressor = new VideoCompressor({ input: file, output: { size: file.size > 10 * 1024 * 1024 ? '720p' : '480p', // 根据文件大小选择分辨率 format: 'mp4' } }) compressor.compress() .then(result => { resolve(result) }) .catch(err => { reject(err) }) }) } }, handleSuccess(res, file) { console.log(res) }, handleExceed(files, fileList) { this.$message.warning(`当前限制选择 ${this.limit} 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`) } } } </script> ``` 上述示例中,使用了Compressor库来压缩图片,使用VideoCompressor库来压缩视频。在beforeUpload方法中,先判断文件类型,然后使用相应的库进行压缩。最后返回一个Promise对象,用于上传。在handleSuccess方法中,可以处理上传成功后的返回结果。在handleExceed方法中,可以处理超过文件数量限制时的提示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水星记_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值