Vue獲取圖片MD5的方法詳解
背景
計(jì)算圖片的MD5可以將其作為圖片的唯一標(biāo)識(shí),從而優(yōu)化對圖片的存儲(chǔ)和檢索效率,還可以對圖片進(jìn)行有效的去重。
名詞解釋
哈希函數(shù)
哈希函數(shù)是一種數(shù)學(xué)函數(shù),也稱散列函數(shù)。它接受任意長度的輸入,并可以將其轉(zhuǎn)換為固定長度的隨機(jī)字母和數(shù)字組成的字符串。由此函數(shù)計(jì)算的值具有不可逆性,即不能通過逆向演算回原本的數(shù)值,可以有效用于加密。
MD5
MD5是一種廣泛使用的哈希函數(shù),MD5算法會(huì)將圖片/文件的二進(jìn)制數(shù)據(jù)作為輸入,計(jì)算出一個(gè)128位的哈希值,可以用于校驗(yàn)文件的完整性和唯一性。
MD5工具--spark-md5
安裝:npm install --save spark-md5
如果使用typeScript需要繼續(xù)安裝對應(yīng)的類型:npm install --save @types/spark-md5
使用import SparkMD5 from 'spark-md5';
獲取本地上傳圖片的MD5
計(jì)算MD5,重要的是獲取文件的二進(jìn)制數(shù)據(jù)
如果你使用的是原生的<input type="file">,則需要在change事件中找到e.target.files[0]文件
如果使用的是UI組件庫,則一般獲取file.raw
<input type="file" @change="changeFile" />
const changeFile = (e) => {
const file = e.target.files[0];
const fileReader = new FileReader();
const spark = new SparkMD5.ArrayBuffer();
fileReader.readAsArrayBuffer(file);
fileReader.onload = (f) => {
spark.append(f.target.result);
const md5 = spark.end();
console.log('md5', md5);
};
};
運(yùn)行結(jié)果:

獲取支持跨域的網(wǎng)絡(luò)圖片的MD5
fetch獲取
首先使用fetch API獲取圖片,然后將其轉(zhuǎn)換為blob對象。然后,我們使用FileReader的readAsArrayBuffer方法將blob轉(zhuǎn)換為ArrayBuffer
const getFileMd5 = () => {
const fileReader = new FileReader();
const spark = new SparkMD5.ArrayBuffer();
// 圖片url 圖片來源必須支持跨域
fetch('https://picsum.photos/536/354')
.then((response) => response.blob())
.then((blob) => {
fileReader.readAsArrayBuffer(blob);
fileReader.onload = (e) => {
spark.append(e.target?.result as ArrayBuffer);
const md5 = spark.end();
console.log('md5', md5);
};
})
.catch(console.error);
};
運(yùn)行結(jié)果:

Image對象獲取
此方法需要將Image復(fù)制到canvas上面進(jìn)行canvas.toDataURL(),此處涉及到<img>標(biāo)簽的特性:
一般情況下,<img>進(jìn)行圖片加載是不會(huì)發(fā)送網(wǎng)絡(luò)請求的,出于安全考慮,沒有通過CORS授權(quán)獲取的圖像是不允許在canvas中使用的。
因此需要在<img>標(biāo)簽上加上crossOrigin屬性
更多屬性相關(guān)內(nèi)容可查看該鏈接:developer.mozilla.org/zh-CN/docs/Web/HTML/Element/img

<img class="testImg" src="https://picsum.photos/536/354" crossOrigin="anonymous" />
const getFileMd5 = () => {
// 找到圖片對象
const image = document.querySelectorAll('.testImg')[0] as HTMLImageElement;
// 將canvas上的內(nèi)容轉(zhuǎn)換為一個(gè)數(shù)據(jù)URL,該URL代表了canvas 的像素?cái)?shù)據(jù)
const canvas = document.createElement('canvas');
canvas.width = image.width;
canvas.height = image.height;
const ctx = canvas.getContext('2d');
ctx?.drawImage(image, 0, 0, canvas.width, canvas.height);
const dataURL = canvas.toDataURL();
// 將dataUrl數(shù)據(jù)轉(zhuǎn)換為blob
const arr = dataURL.split(',');
const mimeList = arr[0].match(/:(.*?);/);
if (!mimeList || !mimeList.length) return;
const mime = mimeList[1];
const bstr = atob(arr[1]);
let n = bstr.length;
const u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
const blob = new Blob([u8arr], { type: mime });
// 計(jì)算md5
const fileReader = new FileReader();
const spark = new SparkMD5.ArrayBuffer();
fileReader.readAsArrayBuffer(blob);
fileReader.onload = (e) => {
spark.append(e.target?.result as ArrayBuffer);
const md5 = spark.end();
console.log('md5', md5);
};
};
// 方法調(diào)用:要保證圖片已經(jīng)加載完 可以使用setTimeout或者nextTick setTimeout(() => getFileMd5(), 0);
獲取不支持跨域的網(wǎng)絡(luò)圖片的MD5
此情況建議由服務(wù)端進(jìn)行圖片md5的計(jì)算
服務(wù)端設(shè)置響應(yīng)頭
需要服務(wù)端設(shè)置響應(yīng)頭 Access-Control-Allow-Origin: *
通過node轉(zhuǎn)發(fā)獲取
待補(bǔ)充
到此這篇關(guān)于Vue獲取圖片MD5的方法詳解的文章就介紹到這了,更多相關(guān)Vue獲取圖片MD5內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Vue模擬實(shí)現(xiàn)element-ui的分頁器效果
這篇文章主要為大家詳細(xì)介紹了如何利用Vue模擬實(shí)現(xiàn)element-ui的分頁器效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下2022-11-11
ElementUI?select彈窗在特定場合錯(cuò)位問題解決方案
這篇文章主要介紹了ElementUI?select彈窗在特定場合錯(cuò)位問題解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
VUE數(shù)組根據(jù)索引刪除數(shù)據(jù),頁面同時(shí)更新的實(shí)現(xiàn)方法
這篇文章主要介紹了VUE數(shù)組根據(jù)索引刪除數(shù)據(jù),頁面同時(shí)更新的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能(完整代碼)
驗(yàn)證碼功能在我們的身邊用處極廣,今天小編給大家分享基于vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能,感興趣的朋友跟隨小編一起看看吧2019-12-12
示例vue 的keep-alive緩存功能的實(shí)現(xiàn)
這篇文章主要介紹了示例vue 的keep-alive緩存功能的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12
vue3中template使用ref無需.value原因解析
vue3的template中使用ref變量無需使用.value,還可以在事件處理器中進(jìn)行賦值操作時(shí),無需使用.value就可以直接修改ref變量的值,這篇文章主要介紹了原來vue3中template使用ref無需.value是因?yàn)檫@個(gè),需要的朋友可以參考下2024-06-06

