HTML5讀取本地檔案
HTML5為我們提供了一種與本地檔案系統互動的標準方式:File Api。
該規範主要定義了以下資料結構:
-
File
-
FileList
-
Blob
HTML5訪問本地檔案系統時,需要先獲取File
物件控制代碼,怎麼獲取檔案引用控制代碼呢?
選擇檔案
首先檢測一下當前瀏覽器是否支援File
Api
:
1 2 3 4 5 6 |
function isSupportFileApi() { if(window.File && window.FileList && window.FileReader && window |
HTML5雖然可以讓我們訪問本地檔案系統,但是js只能被動地讀取,也就是說只有使用者主動觸發了檔案讀取行為,js才能訪問到File
Api
,這通常發生在表單選擇檔案或者拖拽檔案。
表單輸入
表單提交檔案是最常見的場景,使用者選擇檔案後,觸發了檔案選擇框的change事件,通過訪問檔案選擇框元素的files
屬性可以拿到選定的檔案列表。
如果檔案選擇框指定了multiple,則一個檔案選擇框可以同時選擇多個檔案,files
包含了所有選擇的檔案物件;如果沒有指定,則只能選擇一個檔案,files[0]
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function fileSelect1(e) { var files = this.files; for(var i = 0, len = files.length; i < len; i++) { var f = files[i]; html.push( '<p>', f.name + '(' + (f.type || "n/a") + ')' + ' - ' + f.size + 'bytes' |
拖拽
拖拽是另一種常見的檔案訪問場景,這種方式通過一個叫dataTransfer
的介面來獲得拖拽的檔案列表,更多關於dataTransfer。
拖拽同樣支援多選,使用者可以拖拽多個檔案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function dropHandler(e) { e.stopPropagation(); e.preventDefault(); var files = e.dataTransfer.files; for(var i = 0, len = files.length; i < len; i++) { var f = files[i]; html.push( '<p>', f.name + '(' + (f.type || "n/a") + ')' + ' - ' + f.size + 'bytes', '</p>' ); } document.getElementById('list2').innerHTML = html.join(''); } function dragOverHandler(e) { e.stopPropagation(); e.preventDefault(); e.dataTransfer.dragEffect = 'copy'; } var drag = document.getElementById('drag'); drag.addEventListener('drop', dropHandler, false); drag.addEventListener('dragover', dragOverHandler, false); |
PS:
拖拽有個特別需要注意的事情就是,阻止事件冒泡和事件預設行為,防止瀏覽器自動開啟檔案等行為,比如拖拽一個pdf,瀏覽器可能會開啟pdf。
至此,我們知道,我們可以通過兩種方式來獲得檔案控制代碼,那麼如何讀取檔案內容呢?
讀取檔案
HTML5提供了一個叫FileReader
的介面,用於非同步讀取檔案內容,它主要定義了以下幾個方法:
-
readAsBinaryString(File|Blob)
-
readAsText(File|Blob [, encoding])
-
readAsDataURL(File|Blob)
-
readAsArrayBuffer(File|Blob)
FileReader
還提供以下事件:
- onloadstart
- onprogress
- onload
- onabort
- onerror
- onloadend
一旦呼叫了以上某個方法讀取檔案後,我們可以監聽以上任何一個事件來獲得進度、結果等。
預覽本地圖片
這裡主要用到FileReader的readAsDataURL
方法,通過將圖片資料讀取成Data
URI的方法,將圖片展示出來。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
function fileSelect2(e) { e = e || window.event; var files = this.files; var p = document.getElementById('preview2'); for(var i = 0, f; f = files[i]; i++) { var reader = new FileReader(); reader.onload = (function(file) { return function(e) { var span = document.createElement('span'); span.innerHTML = '<img style="padding: 0 10px;" width="100" src="'+ this.result +'" alt="'+ file.name +'" />'; p.insertBefore(span, null); }; })(f); //讀取檔案內容 reader.readAsDataURL(f); } |