vue3上传图片,进行图片压缩(image-compressor.js)

在图片上传的过程中,如果图片体量过大,会很影响效率,并且在做某些特殊业务的时候,可能对上传图片的大小有限制,我们要么就对上传的文件进行限制,要么就对图片进行压缩后再上传,我这里采用了compressor.js

首先安装依赖

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

然后我们可以先进行一个简单的封装

比如,在utils/compressFile中这样写

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(),});return resolve(compressedFile);},error(e) {return reject(e);},};// 1-3MBif (file.size > 1 * 1024 * 1024 && file.size <= 3 * 1024 * 1024) {options.quality = 0.3; // 压缩质量options.convertSize = false;//不进行图像尺寸的调整options.checkOrientation = false; // 图片翻转,默认为false}// 3-4MBif (file.size > 3 * 1024 * 1024 && file.size <= 4 * 1024 * 1024) {options.quality = 0.25; // 压缩质量options.convertSize = false;//不进行图像尺寸的调整options.checkOrientation = false; // 图片翻转,默认为false}// 5-6MBif (file.size > 5 * 1024 * 1024 && file.size <= 6 * 1024 * 1024) {options.quality = 0.2; // 压缩质量options.convertSize = false;//不进行图像尺寸的调整options.checkOrientation = false; // 图片翻转,默认为false}// 6-7MBif (file.size > 6 * 1024 * 1024 && file.size <= 7 * 1024 * 1024) {options.quality = 0.15; // 压缩质量options.convertSize = false;//不进行图像尺寸的调整options.checkOrientation = false; // 图片翻转,默认为false}// 7-9MBif (file.size > 7 * 1024 * 1024 && file.size <= 9 * 1024 * 1024) {options.quality = 0.1; // 压缩质量options.convertSize = false;//不进行图像尺寸的调整options.checkOrientation = false; // 图片翻转,默认为false}new ImageCompressor(file, options);});
}

这样我们就对不同大小的图片进行了一个简单判断,让其大部分保持在1MB左右,各位小伙伴可以根据自身实际情况写不同的算法,这里的options.quality就是压缩比例,一个7MB左右的图片, 在0.1压缩后,会变成七百KB左右

然后在项目中使用,我这里用vant举例

<template><van-uploader :max-size="9 * 1024 * 1024" @oversize="onOversize" :preview-size="['47vw', '34vw']" v-model="aaa"multiple :after-read="afterRead" :max-count="1" @delete="beforeDelete('zheng')"><img class="upImg" src="@/assets/image/id1.png" alt=""></van-uploader>
</template><script setup>
import compressFile from '@/utils/compressFile';
import { closeToast, showToast } from "vant";
import { ref, onMounted } from 'vue'
import { closeToast, showToast } from "vant";//对文件限制,你们可以根据实际情况来
const onOversize = () => {showToast('文件大小不能超过 9MB');
}//对图片数据进行一个暂存
const aaa = ref([]) //上传
const afterRead = (file) => {// 此时可以自行将文件上传至服务器// 创建文件对象let blobFile = file.filecompressFile(blobFile).then(res => {let formData = new FormData()formData.append('file', res)formData.append('instanceCode', 'minio')aaa.value[0].message = "上传中";aaa.value[0].status = "uploading";// return// 这里假装是你们的接口uploadImg(formData).then((res) => {if (res.code == 200) {// 进行后续操作  aaa.value[0].message = "上传成功";aaa.value[0].status = "done";}}).catch(() => {closeToast();aaa.value[err.i].message = "上传失败";aaa.value[err.i].status = "failed";})})
};const beforeDelete = (type) => {aaa.value.url= []
};
</script>

这样,我们就上传了一个压缩的图片,最大可以上传9MB的,并且会把较大的图片尽可能的压缩在1MB左右

这里大家也可以参考一下别人的文章,也不错,这里面是一些vue2的写法

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

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

相关文章

[C/C++入门][ifelse]10、反向输出一个三位数(求整数的各位数的值)

我们解决编程问题&#xff0c;可以从数学的角度来解析这个问题——如何从一个三位数中分别提取百位、十位和个位的数字&#xff0c;我们可以使用基础的除法和乘法概念。 数位的概念 首先&#xff0c;我们需要了解数位的概念。在十进制系统中&#xff0c;每个位置代表不同的数…

【填坑指南】PHP8报:Unable to load dynamic library ‘zip.so’ 错误

1.原因分析 这种情况多数发生在PHP安装时因为各种原因失败后&#xff0c;残余的库与最后安装的PHP版本不兼容导致的。 2.我的路径 一开始我按照以前摸索出来的安装PHP7.3的成功经验来编译方法安装PHP8.3&#xff0c;发现以前的套路已经失效了。反复重装PHP8.3失败后&#xf…

每日复盘-20240715

20240715 六日涨幅最大: ------1--------300807--------- 天迈科技 五日涨幅最大: ------1--------300807--------- 天迈科技 四日涨幅最大: ------1--------300807--------- 天迈科技 三日涨幅最大: ------1--------300713--------- 英可瑞 二日涨幅最大: ------1--------3007…

广告人的的自白,我们是怎么看“创意”这回事的?

作为广告行业的一员&#xff0c;广告创意确实是这个行业中非常核心且充满魅力的一部分。 创意的本质在于能够触动人心&#xff0c;与目标受众产生共鸣&#xff0c;并且有效地传达品牌或产品的信息。 作为一个多年的广告人&#xff0c;下面是我对创意的来源和什么是成功的创意…

[C/C++入门][循环]14、计算2的幂(2的n次方)

计算2的幂&#xff08;即2的n次方&#xff09;非常经典。你懂几种方法呢&#xff1f;很多人只会一种&#xff0c;我们来分析一下。 可以通过多种方式实现&#xff1a; 1、最简单的方法之一是使用位运算符<<&#xff0c;它本质上是在二进制表示下对2进行左移操作&#x…

java InputStream抽象类介绍

java.io.InputStream 是 Java 输入输出&#xff08;I/O&#xff09;类库中的一个抽象类&#xff0c;它是所有字节输入流类的超类。输入流用于读取数据&#xff08;通常是从文件、网络连接或其他数据源&#xff09;&#xff0c;读取的内容为字节数据。下面是对 InputStream 类的…

UE4-初见虚幻引擎

一.创建自己的工程 1.启动 a.通过桌面双击图标来打开对应版本的虚幻引擎 b.通过EPIC启动器开启动虚幻引擎 2.选择或新建项目 ps:高版本虚幻编辑器可以打开低版本的虚幻项目&#xff0c;但是高版本虚幻的项目不可以由低版本的虚幻编辑器打开。 3. 选择要打开的项目 4.选择模版 选…

Github2.1万星!开发者的“瑞士军刀” 开源!

转载自&#xff1a;GitHub好项目 DevToys 是一个专为开发者设计的实用工具集&#xff0c;它集合了多种开发中常用的功能&#xff0c;如JSON格式化、文本比较、正则表达式测试等&#xff0c;旨在帮助开发者提高编程效率。 镜像代码&#xff1a; http://www.gitpp.com/fm/devt…

Kotlin标准函数(语法糖)let with run also apply快速讲解

目录 1、知识储备——扩展函数 原理 定义扩展函数 调用扩展函数 2、返回值为上下文对象的标准函数 apply also 3、返回值为Lambda表达式结果 let run with 4、一表总结 1、知识储备——扩展函数 原理 Kotlin 在不继承父类或实现接口下&#xff0c;也能扩展一个类的…

第4章 Express路由的深入理解(一)

在本章中&#xff0c;我们将深入探讨 Express 的路由机制&#xff0c;包括参数化路由、嵌套路由、路由前缀、路由分组和路由的高级用法。通过这些知识&#xff0c;读者将能够构建复杂的路由系统&#xff0c;以便处理各种类型的 HTTP 请求。 1 参数化路由 参数化路由允许你在 …

PHP中的函数与调用:深入解析与应用

目录 一、函数基础 1.1 函数的概念 1.2 函数的定义 1.3 函数的调用 二、PHP函数的分类 2.1 内置函数 2.2 用户自定义函数 2.3 匿名函数 2.4 递归函数 2.5 回调函数 2.6 魔术方法 三、函数的参数与返回值 3.1 参数传递 3.2 返回值 四、函数的高级特性 4.1 可变函…

Go语言 字符串和数组

本文主要内容为Go语言数据类型中字符串和数组定义、特性及使用示例。 目录 字符串&#xff08;String&#xff09; 定义 长度及访问 拼接 strings 包 判断前缀 查找 转为大写 转为小写 数组&#xff08;定长&#xff09; 定义 遍历 方式一 方式二 忽略值 总结 …

川大智胜果然开盘涨停,这就是A股的尿性!

昨天特朗普被刺杀未遂&#xff0c;提前赢得了大选。今天A股的川大智胜(002253)开盘即涨停&#xff0c;毫无悬念。 不要觉得奇怪&#xff0c;这就是缅A一直以来的尿性&#xff01;什么炒龙凤&#xff0c;炒麻将&#xff0c;炒数字&#xff0c;炒AI&#xff0c;炒美国大选&#…

ROM修改进阶教程------深度解析小米设备锁机型不解锁bl 刷写特殊类固件的步骤

在玩机过程中会遇到很多自己机型忘记密码或者手机号不用导致机型出现账号锁。无法正常使用。那么此类机型如果无法正常售后解锁。只能通过第三方渠道。例如在早期小米机型有强解bl锁资源。然后刷入完美解锁包。这种可以登陆新账号。但后期新机型只能通过修改分区来屏蔽原设备锁…

【SpringBoot】95、SpringBoot中使用MyBatis-Plus实现自动加密存储和查询自动解密

有的业务需要将敏感数据加密存储到 DB,如果我们每个都手动去加密,再设值,再保存 DB,不仅麻烦,还对开发者不友好,在 MyBatis-Plus 中我们可以使用 BaseTypeHandler 来解决这个问题 1、新增 TypeHandler import com.baomidou.mybatisplus.core.toolkit.AES; import com.b…

ctf中php常见内容(比较、变量覆盖)

php比较 1.字符串和数字 PHP的字符串和数字比较时&#xff0c;会将字符串先转化成数字类型在进行比较。 字符串以数字开头时&#xff0c;以开头数字&#xff08;到字母出现截止&#xff09;作为转换结果&#xff1b;若开头不是数字的字符串或空&#xff08;null&#xff09;…

CORDIC Translate

随便记录一下下&#xff1a; Cordic IP核使用说明以及避坑记录-CSDN博客 本次只用到了Translate&#xff0c;记录一下自己遇到的坑坑 实际配置&#xff1a; timescale 1ns / 1nsmodule cordic_tb();reg clk;wire m_axis_dout_tvalid;reg s_axis_cartesian_tvalid 0;wire [31…

快速上手electron

官方文档: https://www.electronjs.org/zh/docs/latest/ 搭建项目 新建文件夹并初始化项目 mkdir my-electron-app && cd my-electron-app npm init -y注意:新生成的package.json的author(作者)和description(描述)字段要填写补全,不然后期打包会打不了 将package.…

使用Redis实现签到功能:Java示例解析

使用Redis实现签到功能&#xff1a;Java示例解析 在本博客中&#xff0c;我们将讨论一个使用Redis实现的签到功能的Java示例。该示例包括两个主要方法&#xff1a;sign()和signCount()&#xff0c;分别用于用户签到和计算用户当月的签到次数。 1. 签到方法&#xff1a;sign()…

【DRAM存储器三十四】LPDDR4介绍--MR和IO结构

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考资料:《镁光LPDDR4数据手册》 、《JESD209-4B》 目录 MR DDR3、DDR4、LPDDR4的IO结构变化 MR LPDDR4的MR包括保留未用的有64个,这个就不像以前一…