JS實現(xiàn)將圖片URL轉(zhuǎn)base64示例詳解
背景介紹
最近有個需求是將部分DOM生成圖片上傳到服務器,這里就直接用之前項目使用的 html-to-image。
然而,這次與上次不同的是有一個圖片;其實,html-to-image也支持了存在圖片的DOM生成截圖(embed-images)。
出現(xiàn)意外
不出意外的就該出意外了:
很容易理解,就是跨域了請求了。注意,這里本來之前使用img標簽是能正常請求的,并且也不用加crossorigin屬性。 在調(diào)用html-to-image中加上mode: 'no-cors'依然不行。
進入正題吧
然后就想自己搞轉(zhuǎn)base64吧,各種百度谷歌出來了
const image2Base64 = (url: string) => new Promise((resolve, reject) => { if (!url) { resolve(''); return; } const img = new Image(); img.crossOrigin = 'anonymous'; img.src = url; img.onload = () => { const canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; const ctx = canvas.getContext('2d'); ctx?.drawImage(img, 0, 0); const data = canvas.toDataURL(); resolve(data); }; img.onerror = () => { reject(''); }; });
特別需要注意的是:img標簽屬性是crossorigin,new Image需使用crossOrigin。 如果不設置crossOrigin會造成另一個問題:
在用canvas調(diào)用toDataURL方法中出錯了。
然后又是各種百度谷歌,發(fā)現(xiàn)MDN有個權威又無語的解釋:
提煉一下哈:指定crossorigin的圖像,在canvas調(diào)用中不會出現(xiàn)tainted錯誤。
其實上面已經(jīng)能解決大多數(shù)的問題了:
對,沒猜錯,事情沒有絕對的,還是有個例的:
不知是這個圖片服務器咋設置的,各種吧啦吧啦溝通也不給設置跨域白名單啥的,只能自己想辦法了。
nodejs中間層轉(zhuǎn)
const http = require('http'); http.get(url, (res) => { const chunks = []; let size = 0; res.on('data', (chunk) => { chunks.push(chunk); size += chunk.length; }); res.on('end', () => { const data = Buffer.concat(chunks, size); const base64Data = data.toString('base64'); return base64Data; }); });
結果,完美解決。
總結
- 使用crossOrigin能解決大多數(shù)情況
- 如果能在圖片服務器加跨域白名單最好
- 終極大招就是nodejs轉(zhuǎn)
- nodejs弊端:對于圖片無法使用CDN,對服務器壓力增大,慎用
以上就是JS實現(xiàn)將圖片URL轉(zhuǎn)base64示例詳解的詳細內(nèi)容,更多關于JS圖片URL轉(zhuǎn)base64的資料請關注腳本之家其它相關文章!
相關文章
next.js源碼解析getStaticProps?getStaticPaths使用場景
這篇文章主要為大家介紹了next.js源碼解析getStaticProps?getStaticPaths使用場景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08JavaScript中使用toLocaleString數(shù)字格式化處理詳解
這篇文章主要為大家介紹了JavaScript中使用toLocaleString數(shù)字格式化處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08