詳解JavaScript如何生成臨時鏈接
前言
前端基于文件上傳需要有生成臨時可訪問鏈接的能力,我們可以通過URL.createObjectURL和FileReader.readAsDataURAPI來實現(xiàn)。
URL.createObjectURL()
URL.createObjectURL() 靜態(tài)方法會創(chuàng)建一個 DOMString,其中包含一個表示參數(shù)中給出的對象的URL。這個 URL 的生命周期和創(chuàng)建它的窗口中的 document 綁定。這個新的URL 對象表示指定的 File 對象或 Blob 對象。
1. 語法
let objectURL = URL.createObjectURL(object);
2. 參數(shù)
用于創(chuàng)建 URL 的 File 對象、Blob 對象或者 MediaSource 對象。
3. 返回值
一個DOMString包含了一個對象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() 方法時,都會創(chuàng)建一個新的 URL 對象,即使你已經(jīng)用相同的對象作為參數(shù)創(chuàng)建過。當(dāng)不再需要這些 URL 對象時,每個對象必須通過調(diào)用 URL.revokeObjectURL() 方法來釋放。
瀏覽器在 document 卸載的時候,會自動釋放它們,但是為了獲得最佳性能和內(nèi)存使用狀況,你應(yīng)該在安全的時機(jī)主動釋放掉它們。
1. 語法
window.URL.revokeObjectURL(objectURL);
2. 參數(shù) objectURL
一個 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)前文件的一個內(nèi)存URL
2. 執(zhí)行時機(jī)
createObjectURL是同步執(zhí)行(立即的)FileReader.readAsDataURL是異步執(zhí)行(過一段時間)
3. 內(nèi)存使用
createObjectURL返回一段帶hash的url,并且一直存儲在內(nèi)存中,直到document觸發(fā)了unload事件(例如:document close)或者執(zhí)行revokeObjectURL來釋放。FileReader.readAsDataURL則返回包含很多字符的base64,并會比blob url消耗更多內(nèi)存,但是在不用的時候會自動從內(nèi)存中清除(通過垃圾回收機(jī)制)
4. 優(yōu)劣對比
- 使用
createObjectURL可以節(jié)省性能并更快速,只不過需要在不使用的情況下手動釋放內(nèi)存 - 如果不在意設(shè)備性能問題,并想獲取圖片的
base64,則推薦使用FileReader.readAsDataURL
到此這篇關(guān)于詳解JavaScript如何生成臨時鏈接的文章就介紹到這了,更多相關(guān)JavaScript生成臨時鏈接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js正則取值的結(jié)果數(shù)組調(diào)試方法
今天小編就為大家分享一篇js正則取值的結(jié)果數(shù)組調(diào)試方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Javascript-Mozilla和IE中的一個函數(shù)直接量的問題分析
Javascript-Mozilla和IE中的一個函數(shù)直接量的問題分析...2007-08-08
JavaScript運(yùn)行機(jī)制之事件循環(huán)(Event Loop)詳解
這篇文章主要介紹了JavaScript運(yùn)行機(jī)制之事件循環(huán)(Event Loop)詳解,本文從多個方面講解了Event Loop,需要的朋友可以參考下2014-10-10
JavaScript 總結(jié)幾個提高性能知識點(推薦)
下面小編就為大家?guī)硪黄狫avaScript 總結(jié)幾個提高性能知識點(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
精通Javascript系列之Javascript基礎(chǔ)篇
javascrpit的基本概念分析,剛開始學(xué)習(xí)js的朋友可以參考下。2011-06-06
根據(jù)對象的某一屬性進(jìn)行排序的js代碼(如:name,age)
實例為按降序排列,若想改為升序只需把比較器中的value2-value1改為value1-value2就可以了2010-08-08

