前端使用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% -

测试效果

image-20240510141040120

可以看到压缩前的图片大小3.29M,压缩后343KB

在这里插入图片描述

下面是前后的图片对比

原图

测试img

压缩后的图

压缩后的测试img



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。