不少業務場景須要搞定圖片/視頻上傳,同時又要求可以快速預覽效果,避免圖片或視頻稍大或請求響應較慢,使用
createObjectURL()
本地預覽實用性更加。canvas
URL.createObjectURL()
靜態方法會建立一個DOMString
,其中包含一個表示參數中給出的對象的URL。這個 URL 的生命週期和建立它的窗口中的document
綁定。這個新的URL 對象表示指定的File
對象或Blob
對象。瀏覽器
來源: MDNbash
簡單的理解一下就是將一個file
或Blob
類型的對象轉爲UTF-16
的字符串,並保存在當前操做的document
下。異步
擴展1: UTF-8
與UTF-16
與GBK
到底有啥區別, 都是 可變長度的編碼方式 經過對Unicode
碼值進行對應規則轉換後,編碼保持到內存/文件中性能
細提及來就是另外一個故事了,不要在乎細節。ui
固然是本篇主題的預覽功能了。編碼
等等。預覽用FileReader.readAsDataURL(file)
轉base64
搞定啊。url
好的,下一話題。spa
若是你會用FileReader.readAsDataURL(file)
方法,那能夠往下讀類比一下二者優劣。code
返回值
FileReader.readAsDataURL(file)
能夠獲得一段base64
的字符串。URL.createObjectURL(file)
能夠獲得當前文件的一個內存URL
。內存使用
FileReader.readAsDataURL(file)
的返回值是轉化後的超長base64
字符串(長度與要解析的文件大小正相關)。URL.createObjectURL(file)
的返回值雖然是字符串,可是是一個url
地址。內存清理
FileReader.readAsDataURL(file)
依照JS垃圾回收機制自動從內存中清理。URL.createObjectURL(file)
存在於當前doucment
內,清除方式只有unload()
事件或revokeObjectURL()
手動清除 。執行機制
FileReader.readAsDataURL(file)
經過回調的形式返回,異步執行。URL.createObjectURL(file)
直接返回,同步執行。兼容性
IE10
以上,其餘瀏覽器均支持。其餘
FileReader.readAsDataURL(file)
當多個文件同時處理時,須要每個文件對應一個新的FileReader
對象。
URL.createObjectURL(file)
依次返回無影響。
URL.createObjectURL(file)
獲得本地內存容器的URL
地址,方便預覽,屢次使用須要注意手動釋放內存的問題,性能優秀。 FileReader.readAsDataURL(file)
勝在直接轉爲base64
格式,能夠直接用於業務,無需二次轉換格式。
關於使用canvas
截取視頻第一幀的問題,下篇再來。
附1:Base64 to Blob
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
}
複製代碼