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

news2024/12/23 14:08:48

前言

上传文件是一个常见的需求,并且文件大小往往成为限制因素之一。为了提升用户体验和节省带宽消耗,上传时的文件压缩便显得格外重要。本文将介绍基于 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 对象来处理异步操作,以实现图片上传时压缩大小的功能。


实现效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/938334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常用命令——depmod命令

在线Linux命令查询工具 depmod 分析可载入模块的相依性 补充说明 depmod命令可产生模块依赖的映射文件&#xff0c;在构建嵌入式系统时&#xff0c;需要由这个命令来生成相应的文件&#xff0c;由modprobe使用。 语法 depmod(选项)选项 -a或--all&#xff1a;分析所有可…

Redis数据结构:Set类型全面解析

Set 类型是一个无序并唯一的键值集合&#xff0c;它的存储顺序不会按照插入的先后顺序进行存储。Redis 中集合是通过哈希表实现的&#xff0c;所以添加&#xff0c;删除&#xff0c;查找的复杂度都是 O(1)。相对于列表&#xff0c;集合也有两个特点&#xff1a;无序、不可重复 …

【内网穿透】搭建我的世界Java版服务器,公网远程联机

目录 前言 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 2. 测试局域网联机 3. 公网远程联机 3.1 安装cpolar内网穿透 3.1.1 windows系统 3.1.2 linux系统&#xff08;支持一键自动安装脚本&#xff09; 3.2 创建隧道映射内网端口 3.3 测试公网远程…

Spring AOP基于注解方式实现和细节

目录 一、Spring AOP底层技术 二、初步实现AOP编程 三、获取切点详细信息 四、 切点表达式语法 五、重用&#xff08;提取&#xff09;切点表达式 一、Spring AOP底层技术 SpringAop的核心在于动态代理&#xff0c;那么在SpringAop的底层的技术是依靠了什么技术呢&#x…

国产AI芯片突破,芯片或成白菜价,恐惧的美芯阻止台积电为它代工

日前消息指台积电大幅减少一家中国AI芯片企业的产能&#xff0c;原因在于国产AI芯片的性能已接近美芯&#xff0c;美国芯片企业NVIDIA与相关的资本机构贝莱德联手施压台积电所致&#xff0c;凸显出美国芯片忧虑中国AI芯片的竞争力。 这家国产AI芯片企业为壁仞科技&#xff0c;据…

C#,《小白学程序》第七课:列表(List)应用之一————编制高铁车次信息表

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary>…

【JavaSE专栏89】Java字符串和XML数据结构的转换,高效灵活转变数据

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;3年JAVA全栈开发经验&#xff0c;专注JAVA技术、系统定制、远程指导&#xff0c;致力于企业数字化转型&#xff0c;CSDN学院、蓝桥云课认证讲师。 主打方向&#xff1a;Vue、SpringBoot、微信小程序 本文讲解了 XML 的概…

软件测试的方法有哪些?

软件测试 根据利用的被测对象信息的不同&#xff0c;可以将软件测试方法分为&#xff1a;黑盒测试、灰盒测试、白盒测试。 1、白盒测试 1&#xff09;概念&#xff1a;是依据被测软件分析程序内部构造&#xff0c;并根据内部构造分析用例&#xff0c;来对内部控制流程进行测试…

基于Dpabi的功能连接

1.预处理 这里预处理用Gretna软件进行&#xff0c;共分为以下几步&#xff1a; &#xff08;1&#xff09;DICOM转NIfTI格式 (2)去除前10个时间点(Remove first 10 times points)&#xff1a;由于机器刚启动、被试刚躺进去也还需适应环境&#xff0c;导致刚开始扫描的数据很…

macOS 安装 Homebrew 详细过程

文章目录 macOS 安装 Homebrew 详细过程Homebrew 简介Homebrew 安装过程设置环境变量安装 Homebrew安装完成后续设置(重要)设置环境变量homebrew 镜像源设置macOS 安装 Homebrew 详细过程 本文讲解了如何使用中科大源安装 Homebrew 的安装过程,文章里面的所有步骤都是必要的,需…

ExpressLRS开源之RC链路性能测试

ExpressLRS开源之RC链路性能测试 1. 源由2. 分析3. 测试方案4. 测试设计4.1 校准测试4.2 实验室测试4.3 拉距测试4.4 遮挡测试 5. 总结6. 参考资料 1. 源由 基于ExpressLRS开源基本调试验证方法&#xff0c;对RC链路性能进行简单的性能测试。 修改设计总能够满足合理的需求&a…

Streamlit 讲解专栏(十一):数据可视化-图表绘制详解(中)

文章目录 1 前言2 绘制交互式散点图3 定制图表主题4 增强数据可视化的交互性与注释步骤1步骤二 5 结语 1 前言 在上一篇博文《 Streamlit 讲解专栏&#xff08;十&#xff09;&#xff1a;数据可视化-图表绘制详解&#xff08;上&#xff09;》中&#xff0c;我们学习了一些关…

Vue脚手架中安装ElementUi

目录 ElementUi简介&#xff1a; ElementUi下载&#xff1a; npm 安装&#xff1a; 引入ElementUi: 测试是否引入成功&#xff1a; Element-ui官网&#xff1a;组件 | Element ElementUi简介&#xff1a; ElementUi&#xff0c;是由国内的饿了么团队开发并开源的一套为开…

美五代机装备激光武器可行性分析

源自&#xff1a;北京蓝德信息科技有限公司 一、SHiELD项目研究进展分析 图表&#xff1a;SHiELD项目主要情况 二、机载激光武器面临的技术挑战分析 三、五代机装备激光武器的可行性 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不…

三维模型OBJ格式轻量化压缩处理效率提高的技术方法探讨

三维模型OBJ格式轻量化压缩处理效率提高的技术方法探讨 要提高三维模型OBJ格式轻量化压缩处理的效率&#xff0c;可以采取以下方法&#xff1a; 1、优化算法选择&#xff1a;选择合适的优化算法对模型进行轻量化处理。不同的优化算法有不同的时间复杂度和效果。一些常用的优化…

软件测试用例经典方法 | 因果图法及案例

典型的黑盒测试用例设计方法包括等价类划分法、边界值分析法、决策表法、因果图法等。 如果程序的输入条件之间相互存在联系,那么就会使情况变得复杂,因为要检查输入条件的组合情况并不是一件容易的事情,即使把所有输入条件划分为等价类,它们之间的组合情况也相当多,难以分析。…

【Go 基础篇】深入探索:Go语言中的二维数组

在计算机编程中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储相同类型的元素。而二维数组作为数组的一种扩展&#xff0c;允许我们以类似表格的方式存储和处理数据。在Go语言中&#xff0c;二维数组是一个重要的概念&#xff0c;本文将深入探讨Go语言中的二维数组…

兄弟,王者荣耀的段位排行榜是通过Redis实现的?

目录 一、排行榜设计方案1、数据库直接排序2、王者荣耀好友排行 二、Redis实现计数器1、什么是计数器功能&#xff1f;2、Redis实现计数器的原理&#xff08;1&#xff09;使用INCR命令实现计数器&#xff08;2&#xff09;使用INCRBY命令实现计数器 三、通过Redis实现“王者荣…

基于知识引入的情感分析研究综述

1.引文 情感分析知识 当training数据不足以覆盖inference阶段遇到的特征时&#xff0c;是标注更多的数据还是利用现有外部知识充当监督信号&#xff1f; 基于机器学习、深度学习的情感分析方法&#xff0c;经常会遇到有标注数据不足&#xff0c;在实际应用过程中泛化能力差的局…

C语言巧用联合体union判定数据的存储格式(大小端)

联合体大家可能比较陌生&#xff0c;但是大家对结构体稍微熟悉一点吧。其实它们二个类似&#xff0c;只不过结构体成员占用不同的地址&#xff0c;而联合体所有成员占用相同地址。利用这个特性我们就能判断在当前编译器下存储的数据的格式。那么如何确定呢&#xff1f; 我这里…