詳解JavaScript如何生成臨時(shí)鏈接
前言
前端基于文件上傳需要有生成臨時(shí)可訪問鏈接的能力,我們可以通過URL.createObjectURL
和FileReader.readAsDataUR
API來實(shí)現(xiàn)。
URL.createObjectURL()
URL.createObjectURL()
靜態(tài)方法會(huì)創(chuàng)建一個(gè) DOMString
,其中包含一個(gè)表示參數(shù)中給出的對象的URL。這個(gè) URL 的生命周期和創(chuàng)建它的窗口中的 document
綁定。這個(gè)新的URL 對象表示指定的 File
對象或 Blob
對象。
1. 語法
let objectURL = URL.createObjectURL(object);
2. 參數(shù)
用于創(chuàng)建 URL 的 File
對象、Blob
對象或者 MediaSource
對象。
3. 返回值
一個(gè)DOMString
包含了一個(gè)對象URL,該URL可用于指定源 object的內(nèi)容。
4. 示例
<input type="file" id="file"> document.querySelector('#file').onchange = function (e) { console.log(e.target.files[0]) console.log(URL.createObjectURL(e.target.files[0])) }
將上方console控制臺打印的blob文件資源地址粘貼到瀏覽器中
blob:http://localhost:8080/1ece2bb1-b426-4261-89e8-c3bec43a4020
URL.revokeObjectURL()
在每次調(diào)用 createObjectURL()
方法時(shí),都會(huì)創(chuàng)建一個(gè)新的 URL 對象,即使你已經(jīng)用相同的對象作為參數(shù)創(chuàng)建過。當(dāng)不再需要這些 URL 對象時(shí),每個(gè)對象必須通過調(diào)用 URL.revokeObjectURL()
方法來釋放。
瀏覽器在 document 卸載的時(shí)候,會(huì)自動(dòng)釋放它們,但是為了獲得最佳性能和內(nèi)存使用狀況,你應(yīng)該在安全的時(shí)機(jī)主動(dòng)釋放掉它們。
1. 語法
window.URL.revokeObjectURL(objectURL);
2. 參數(shù) objectURL
一個(gè) DOMString
,表示通過調(diào)用 URL.createObjectURL()
方法返回的 URL 對象。
3. 返回值
undefined
4. 示例
<input type="file" id="file"> <img id="img1" style="width: 200px;height: auto" /> <img id="img2" style="width: 200px;height: auto" />
document.querySelector('#file').onchange = function (e) { const file = e.target.files[0] const URL1 = URL.createObjectURL(file) console.log(URL1) document.querySelector('#img1').src = URL1 URL.revokeObjectURL(URL1) const URL2 = URL.createObjectURL(file) console.log(URL2) document.querySelector('#img2').src = URL2 }
與FileReader.readAsDataURL(file)區(qū)別
1. 主要區(qū)別
- 通過
FileReader.readAsDataURL(file)
可以獲取一段data:base64
的字符串 - 通過
URL.createObjectURL(blob)
可以獲取當(dāng)前文件的一個(gè)內(nèi)存URL
2. 執(zhí)行時(shí)機(jī)
createObjectURL
是同步執(zhí)行(立即的)FileReader.readAsDataURL
是異步執(zhí)行(過一段時(shí)間)
3. 內(nèi)存使用
createObjectURL
返回一段帶hash
的url
,并且一直存儲(chǔ)在內(nèi)存中,直到document
觸發(fā)了unload
事件(例如:document close
)或者執(zhí)行revokeObjectURL
來釋放。FileReader.readAsDataURL
則返回包含很多字符的base64
,并會(huì)比blob url
消耗更多內(nèi)存,但是在不用的時(shí)候會(huì)自動(dòng)從內(nèi)存中清除(通過垃圾回收機(jī)制)
4. 優(yōu)劣對比
- 使用
createObjectURL
可以節(jié)省性能并更快速,只不過需要在不使用的情況下手動(dòng)釋放內(nèi)存 - 如果不在意設(shè)備性能問題,并想獲取圖片的
base64
,則推薦使用FileReader.readAsDataURL
到此這篇關(guān)于詳解JavaScript如何生成臨時(shí)鏈接的文章就介紹到這了,更多相關(guān)JavaScript生成臨時(shí)鏈接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript String 對象常用方法總結(jié)
下面小編就為大家?guī)硪黄狫avaScript String 對象常用方法總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考2016-04-04JavaScript?ECMAScript?6(ES2015~ES2022)所有新特性總結(jié)
這篇文章主要介紹了JavaScript?ECMAScript?6(ES2015~ES2022)所有新特性總結(jié),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07js實(shí)現(xiàn)一個(gè)簡單的數(shù)字時(shí)鐘效果
本文主要介紹了js實(shí)現(xiàn)一個(gè)簡單的數(shù)字時(shí)鐘效果的示例代碼。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-03-03淺談JavaScript中Date(日期對象),Math對象
這篇文章主要簡單介紹了JavaScript中Date(日期對象),Math對象的相關(guān)資料,需要的朋友可以參考下2015-02-02uniapp多選框全選功能的實(shí)現(xiàn)思路與方法實(shí)例
uniapp給我們提供了tabs組件進(jìn)行單項(xiàng)的切換,但是多選的效果需要我們自己去手寫,下面這篇文章主要給大家介紹了關(guān)于uniapp多選框全選功能實(shí)現(xiàn)思路與方法的相關(guān)資料,需要的朋友可以參考下2022-08-08bootstrap table插件動(dòng)態(tài)加載表頭
這篇文章主要為大家詳細(xì)介紹了bootstrap table插件動(dòng)態(tài)加載表頭,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07JavaScript實(shí)現(xiàn)網(wǎng)頁版貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁版貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07