Vue與compressor.js實(shí)現(xiàn)高效文件壓縮的方法
前言
上傳文件是一個(gè)常見的需求,并且文件大小往往成為限制因素之一。為了提升用戶體驗(yàn)和節(jié)省帶寬消耗,上傳時(shí)的文件壓縮便顯得格外重要。本文將介紹基于 Vue 框架和 compressor.js 的上傳時(shí)文件壓縮實(shí)現(xiàn)方法,通過在上傳過程中對(duì)文件進(jìn)行壓縮,減小文件大小,提升上傳速度,為用戶創(chuàng)造更快捷、高效的上傳體驗(yàn)。
安裝
npm install image-compressor.js yarn add image-compressor.js
compressor.js 常用的屬性
屬性 | 描述 |
---|---|
quality | 設(shè)置壓縮圖像的質(zhì)量。值范圍為0到1之間,其中0表示最低質(zhì)量,1表示最高質(zhì)量。 |
width | 指定壓縮圖像的目標(biāo)寬度??梢允褂孟袼鼗虬俜直葋肀硎?。 |
height | 指定壓縮圖像的目標(biāo)高度??梢允褂孟袼鼗虬俜直葋肀硎尽?/td> |
minWidth | 限制壓縮后的圖像寬度的最小值。如果圖像的寬度小于此值,將不會(huì)進(jìn)行壓縮。 |
minHeight | 限制壓縮后的圖像高度的最小值。如果圖像的高度小于此值,將不會(huì)進(jìn)行壓縮。 |
maxWidth | 限制壓縮后的圖像寬度的最大值。如果圖像的寬度超過此值,將會(huì)按比例縮小。 |
maxHeight | 限制壓縮后的圖像高度的最大值。如果圖像的高度超過此值,將會(huì)按比例縮小。 |
convertSize | 確定是否在壓縮時(shí)調(diào)整圖像的大小。如果設(shè)置為true,將根據(jù)目標(biāo)寬度和高度自動(dòng)調(diào)整圖像大小。 |
checkOrientation | 檢查圖像的方向信息,并根據(jù)需要進(jìn)行自動(dòng)旋轉(zhuǎn)。 |
這些是 compressorjs
插件的一些常見屬性,用于控制圖像的壓縮質(zhì)量、尺寸和方向。你可以根據(jù)實(shí)際需求設(shè)置這些屬性以獲得想要的壓縮效果。更多詳細(xì)信息和屬性,請(qǐng)參閱插件的官方文檔。
封裝文件
import ImageCompressor from 'image-compressor.js'; export default function compressFile(file) { return new Promise((resolve, reject) => { const options = { success(result) { // 將壓縮后的 Blob 轉(zhuǎn)換為 File 對(duì)象(如果組件支持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; // 壓縮質(zhì)量 options.convertSize = false;//不進(jìn)行圖像尺寸的調(diào)整 options.checkOrientation = false; // 圖片翻轉(zhuǎn),默認(rèn)為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, "未壓縮大小"); // 調(diào)用壓縮圖片的方法 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) => { // 執(zhí)行操作 }); }, }, }; </script>
實(shí)現(xiàn)過程
- 首先,需要在 Vue 組件中引入 ImageCompressor 庫??梢酝ㄟ^ import ImageCompressor from 'image-compressor.js' 來實(shí)現(xiàn);
- 下面是一個(gè)名為 compressFile 的函數(shù)。該函數(shù)接受一個(gè)文件(file)作為參數(shù),并返回一個(gè) Promise 對(duì)象,用于處理異步操作;
- 在 compressFile 函數(shù)內(nèi)部,創(chuàng)建了一個(gè) options 對(duì)象,其中包含了成功(success)和錯(cuò)誤(error)的回調(diào)函數(shù);
- 如果文件的大小超過 5MB,則設(shè)置 options 對(duì)象的 quality 屬性為 0.6,表示壓縮質(zhì)量為 60%;
- 接下來,創(chuàng)建一個(gè) ImageCompressor 實(shí)例,將文件和 options 對(duì)象作為參數(shù)傳遞給它。這將觸發(fā)圖片壓縮的過程;
- 當(dāng)壓縮成功時(shí),會(huì)調(diào)用 success 回調(diào)函數(shù)。在回調(diào)函數(shù)中,將壓縮后的 Blob 對(duì)象轉(zhuǎn)換為 File 對(duì)象,并使用 resolve 方法將其作為 Promise 的返回值返回;
- 當(dāng)壓縮出錯(cuò)時(shí),會(huì)調(diào)用 error 回調(diào)函數(shù)。在回調(diào)函數(shù)中,使用 reject 方法將錯(cuò)誤信息作為 Promise 的返回值返回;
- 接下來是一個(gè) Vue 組件的模板代碼。在模板中使用了 van-uploader 組件來實(shí)現(xiàn)圖片的上傳功能;
- 在 methods 屬性中定義了一個(gè)名為 clzpAfterRead 的方法。該方法會(huì)在圖片上傳成功后觸發(fā)。參數(shù) file 表示上傳的文件,detail 表示上傳的詳細(xì)信息,name 表示上傳文件的名稱;
- 在 clzpAfterRead 方法中,首先打印出上傳文件的原始大小 file.file.size。接下來,調(diào)用 this.$compressFile 方法對(duì)上傳的文件進(jìn)行壓縮;
- 使用 await 關(guān)鍵字等待壓縮操作完成,并將壓縮后的文件賦值給 compressedFile 變量;
- 打印出壓縮后文件的大小 compressedFile.size;
- 創(chuàng)建一個(gè) FormData 對(duì)象 formData,并將壓縮后的文件添加到 formData 中;
- 調(diào)用 uploadFile 方法,將 formData 作為參數(shù)傳遞給它,并使用 .then 方法處理上傳成功后的響應(yīng);
- 在 .then 方法中可以執(zhí)行后續(xù)操作,例如更新界面或處理上傳成功的數(shù)據(jù)。
總結(jié)起來,這段代碼的實(shí)現(xiàn)思路是:通過 van-uploader
組件實(shí)現(xiàn)圖片上傳功能,在上傳成功后調(diào)用 clzpAfterRead
方法,將上傳的圖片文件通過 image-compressor.js
庫進(jìn)行壓縮,并將壓縮后的文件再次上傳到服務(wù)器。整個(gè)過程使用了 Vue
框架以及 Promise
對(duì)象來處理異步操作,以實(shí)現(xiàn)圖片上傳時(shí)壓縮大小的功能。
實(shí)現(xiàn)效果
到此這篇關(guān)于Vue與compressor.js實(shí)現(xiàn)高效文件壓縮的文章就介紹到這了,更多相關(guān)Vue compressor.js文件壓縮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue中對(duì)watch的理解(關(guān)鍵是immediate和deep屬性)
watch偵聽器,是Vue實(shí)例的一個(gè)屬性,是用來響應(yīng)數(shù)據(jù)的變化,需要在數(shù)據(jù)變化時(shí)執(zhí)行異步或開銷較大的操作時(shí),這個(gè)方式是最有用的,這篇文章主要介紹了Vue中對(duì)watch的理解,需要的朋友可以參考下2022-11-11Vue echarts模擬后端數(shù)據(jù)流程詳解
在平常的項(xiàng)目中,echarts圖表我們也是使用的非常多的,通常我們從后端拿到數(shù)據(jù),需要在圖表上動(dòng)態(tài)的進(jìn)行呈現(xiàn),接下來我們就模擬從后端獲取數(shù)據(jù)然后進(jìn)行呈現(xiàn)的方法2022-09-09