前端使用Compressor.js实现图片压缩上传
szx的开发笔记 2024-07-09 13:03:02 阅读 70
前端使用Compressor.js实现图片压缩上传
Compressor.js官方文档
安装
<code>npm install compressorjs
使用
在使用ElementUI或者其他UI框架的上传组件时,都会有上传之前的钩子函数,在这个函数中可以拿到原始file,这里我用VantUI的上传做演示
afterRead 函数是上传之前的钩子,可以获取到原始file
<template>
<div>
<van-uploader
:max-count="prop.limit"code>
v-model="state.fileList"code>
:after-read="afterRead"code>
:before-read="beforeRead"code>
@delete="deleteFile"code>
/>
</div>
</template>
<script setup>
import { reactive, defineEmits, defineProps, watch } from 'vue'
import { FileUploadFun } from '@/api/index.js'
import { useCustomFieldValue } from '@vant/use'
import { Toast } from 'vant'
import Compressor from 'compressorjs'
const prop = defineProps({
url: {
type: String,
default: '',
},
limit: {
type: Number,
default: 5,
},
})
const emit = defineEmits(['onSuccess'])
const state = reactive({
fileList: [],
})
watch(
() => prop.url,
() => {
if (prop.url) {
state.fileList = []
prop.url.split(',').forEach((item) => {
state.fileList.push({
url: item,
})
})
}
}
)
// 文件上传之前对图片进行压缩
const beforeRead = (file) => {
return new Promise((resolve, reject) => {
new Compressor(file, {
// 压缩质量,0-1之间。数字越小,压缩比越高
quality: 0.2,
success(result) {
// 默认返回result是blob类型的文件,可以转成file并返回,交给afterRead钩子进行上传
let newFile = new File([result], file.name, { type: file.type })
resolve(newFile)
},
error(err) {
reject(err)
},
})
})
}
// 文件上传后触发
const afterRead = (file) => {
file.status = 'uploading'
file.message = '上传中...'
FileUploadFun(file.file)
.then((res) => {
file.status = 'done'
file.message = '上传成功'
let urls = state.fileList.map((i) => i.url)
urls.pop()
urls.push(res.data.url)
// 通知外界上传成功
emit('onSuccess', urls.join(','))
})
.catch(() => {
state.fileList.pop()
file.status = 'done'
Toast('上传失败')
})
}
// 文件删除后触发
const deleteFile = () => {
emit('onSuccess', state.fileList.map((i) => i.url).join(','))
}
// 用于返回信息
useCustomFieldValue(() => state.fileList.map((item) => item.url).join(','))
</script>
示例
Quality | 原始大小 | 压缩后大小 | 压缩比 | Description |
---|---|---|---|---|
0 | 2.12 MB | 114.61 KB | 94.72% | - |
0.2 | 2.12 MB | 349.57 KB | 83.90% | - |
0.4 | 2.12 MB | 517.10 KB | 76.18% | - |
0.6 | 2.12 MB | 694.99 KB | 67.99% | 推荐 |
0.8 | 2.12 MB | 1.14 MB | 46.41% | 推荐 |
1 | 2.12 MB | 2.12 MB | 0% | 不推荐 |
NaN | 2.12 MB | 2.01 MB | 5.02% | - |
测试效果
可以看到压缩前的图片大小3.29M,压缩后343KB
下面是前后的图片对比
原图
压缩后的图
上一篇: 【网络实验】华为防火墙基础之安全策略以及easyIP和NAPT以及web管理的配置
下一篇: 两年经验前端带你重学前端框架必会的ajax+node.js+webpack+git等技术 Day2
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。