前端使用Compressor.js實現(xiàn)圖片壓縮上傳的詳細(xì)過程
安裝
npm install compressorjs
使用
在使用ElementUI或者其他UI框架的上傳組件時,都會有上傳之前的鉤子函數(shù),在這個函數(shù)中可以拿到原始file,這里我用VantUI的上傳做演示
afterRead 函數(shù)是上傳之前的鉤子,可以獲取到原始file
<template>
<div>
<van-uploader
:max-count="prop.limit"
v-model="state.fileList"
:after-read="afterRead"
:before-read="beforeRead"
@delete="deleteFile"
/>
</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,
})
})
}
}
)
// 文件上傳之前對圖片進(jìn)行壓縮
const beforeRead = (file) => {
return new Promise((resolve, reject) => {
new Compressor(file, {
// 壓縮質(zhì)量,0-1之間。數(shù)字越小,壓縮比越高
quality: 0.2,
success(result) {
// 默認(rèn)返回result是blob類型的文件,可以轉(zhuǎn)成file并返回,交給afterRead鉤子進(jìn)行上傳
let newFile = new File([result], file.name, { type: file.type })
resolve(newFile)
},
error(err) {
reject(err)
},
})
})
}
// 文件上傳后觸發(fā)
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('上傳失敗')
})
}
// 文件刪除后觸發(fā)
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

下面是前后的圖片對比
原圖

壓縮后的圖

總結(jié)
到此這篇關(guān)于前端使用Compressor.js實現(xiàn)圖片壓縮上傳的文章就介紹到這了,更多相關(guān)前端Compressor.js圖片壓縮上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實現(xiàn)為指定對象添加多個事件處理程序的方法
這篇文章主要介紹了JavaScript實現(xiàn)為指定對象添加多個事件處理程序的方法,可實現(xiàn)讓指定對象處理多個事件的功能,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04
Jupyter Notebook運行JavaScript的方法
Jupyter Notebook是一塊所見即所得的畫布,通過在瀏覽器上編輯代碼,讓開發(fā)人員實現(xiàn)展示與快速迭代的利器,本文主要介紹了Jupyter Notebook運行JavaScript的方法,感興趣的可以了解一下2021-05-05
JS動態(tài)加載腳本并執(zhí)行回調(diào)操作
這篇文章主要為大家詳細(xì)介紹了JS動態(tài)加載腳本并下載完成后執(zhí)行回調(diào)操作,感興趣的小伙伴們可以參考一下2016-08-08
使用JavaScript + HTML實現(xiàn)表格滾動效果
本文介紹了如何使用HTML、CSS和JavaScript實現(xiàn)表格滾動效果,特別是在大屏展示或排行榜場景中,通過平滑滾動動畫,提升信息展示效率,支持?jǐn)?shù)據(jù)動態(tài)更新和播放暫停控制,使用戶能夠高效瀏覽大量數(shù)據(jù),需要的朋友可以參考下2026-04-04
javascript實現(xiàn)上傳圖片并預(yù)覽的效果實現(xiàn)代碼
圖片上傳預(yù)覽,就是在使用文件選擇框選擇了文件之后就可以在頁面上看見圖片的效果,關(guān)于這個效果我一直認(rèn)為是無法做到的2011-04-04
axios params 和 data 的區(qū)別小結(jié)
本文介紹了在前端開發(fā)中使用Axios發(fā)送HTTP請求時,params和data的區(qū)別及其應(yīng)用場景,具有一定的參考價值,感興趣的可以了解一下2025-03-03

