![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIGOxUWYycTM9U2YyV3bz9zZwpmL3BDN0EzXkVmbpZWZk5WdvwVbvNmLn1WaopnLyMWaw9CXvwlOzBHd0hWPsJXdmYDM3YjZkJGNzQDNl1SOhRGOtETMiVWLlNTY10CM1czM1czNy0DZpV3ZmITPlBXe0ZyPldWYtl2LcdXZpZ3Lc12bj5SZjVjL5h3byBnLxATLn1Wavw1LcpDc0RHaiojIsJye.jpg)
在html5中新增了兩個與表單元素相關的api-檔案api和拖放api。拖放api可以實作一些有趣的功能,允許我們拖動選項并将其放置到浏覽器中的任何地方。這很好地展現了html5作為web應用程式規範的思路,使得開發者可以從桌面計算中借用更多的功能。
一、通過file對象選擇檔案
在HTML4中,file控件内隻允許放置一個檔案,
但是到了HTML5中,通過添加multiple屬性,在file控件内允許一次放置多個檔案。控件内的每一個使用者選擇的檔案都是一個
file對象,而FileList對象則為這些file對象的清單,代表用
戶選擇的所有檔案。
File對象有兩個屬性,name屬性表示檔案名,不包括路
徑,lastModifiedDate屬性表示檔案的最後修改日期。
<!DOCTYPE html><head>
<meta charset="UTF-8">
<title>FileList與file示例</title>
</head>
<script language=javascript>
function ShowName()
{
var file;
//傳回FileList檔案清單對象
for(var i=0;i<document.getElementById("file").files.length;i++)
{
//file對象為使用者選擇的單個檔案
file = document.getElementById("file").files[i];
//彈出檔案名
alert(file.name);
}
}
</script>
選擇檔案:
<input type="file" id="file"size="50"/>
<input type="button" onclick="ShowName();" value="上傳檔案"/>
二、使用Blob接口擷取檔案的類型與大小
Blob表示二進制原始資料,它提供一個slice方法(涉及到分片上傳),可以通過該方法通路到位元組内部的原始資料塊。Blob對象有兩個屬性,size屬性表示一個blob對象的位元組長度,type屬性表示blob的MIME類型,如果是未知類型,則傳回一個空字元串。
在上面的執行個體中,對于圖像類型的檔案,blob對象的type屬性都是以
開頭的,後面緊跟這圖像的類型,利用此特性我們可以在
“image/”
中判斷使用者選擇的檔案是否為圖像檔案,如果在批量上傳時,隻允許上傳圖像檔案,可以利用該屬性,如果使用者選擇的多個檔案中有不是圖像的檔案時,可以彈出錯誤提示資訊,并停止後面的檔案上傳,或者跳過這個檔案,不将該檔案上傳。
JavaScript
if(!/image/w+/.test(file.type))
{
alert(file.name+"不是圖像檔案!");
break;
}
三、FileReader接口
有一種方法可以檢查您的浏覽器是否對FileReader接口提供
支援,如下所示:
if ( typeof FileReader === ‘undefined’ )
{
alert( " 您的浏覽器未實作 FileReader 接口 " );
} else {
var reader = new FileReader();
// 正常使用浏覽器
}
FileReader
的接口擁有 4 個方法,其中 3 個用以讀取檔案,另一個用來中斷讀取。下面的表格列出了這些方法以及它們的參數和功能,需要注意的是 ,無論讀取成功或失敗,方法并不會傳回讀取結果,這一結果存儲在 result屬性中。
FileReader接口中的屬性
FileReader.error
: 讀取檔案的時候發生的錯誤資訊
FileReader.readyState
:0-2數字,表示FileReader的狀态
EMPTY 0 No data has been loaded yet.還沒有加載到資料
LOADING 1 Data is currently being loaded.這正在加載資料
DONE 2 The entire read request has been completed.資料加載完成
FileReader.result
:這個是最重要的屬性。讀取到的内容都存儲在了這個屬性中。隻能在readyState DONE之後才能讀取這個屬性值。讀取到的資料類型取決于用什麼的方法去讀取的檔案。
FileReader接口中的方法
FileReader.abort()
:終止讀取檔案的操作。這個方法一點結束,則readyState就成為了DONE
FileReader.readAsArrayBuffer()
:開始讀取檔案的内容,一旦完成,則把檔案的資料存儲在ArrayBuffer中。當然ArrayBuffer自然會存儲在FileReader的result屬性中。
FileReader.readAsBinaryString()
:以二進制的形式讀取檔案的内容。這個方法是非标準方法,不要使用。
FileReader.readAsDataURL()
:将檔案讀取為DateUrl
FileReader.readAsText()
:将檔案的内容讀取文本。讀取純文字内容的時候使用。
FileReader接口中的事件
FileReader.onabort
:資料讀取被中斷時觸發。
A handler for the abort event. This event is triggered each time the reading operation is aborted.
FileReader.onerror
:資料讀取發生錯誤時觸發。
A handler for the error event. This event is triggered each time the reading operation encounter an error.
FileReader.onload
:資料讀取成功後觸發。
A handler for the load event. This event is triggered each time the reading operation is successfully completed.
FileReader.onloadstart
:資料開始讀取時觸發。
A handler for the loadstart event. This event is triggered each time the reading is starting.
FileReader.onloadend
:資料讀取完成後觸發。不管資料讀取成功還是失敗都會觸發。
A handler for the loadend event. This event is triggered each time the reading operation is completed (either in success or failure).
FileReader.onprogress
:資料讀取過程中觸發。
A handler for the progress event. This event is triggered while reading a Blob content.
<!DOCTYPE html><head>
<meta charset="UTF-8">
<title>fileReader對象的事件先後順序</title>
</head>
<script language=javascript>
var result=document.getElementById("result");
var input=document.getElementById("input");
if(typeof FileReader=='undefined')
{
result.innerHTML = "<p class='warn'>抱歉,你的浏覽器不支援 FileReader</p>";
input.setAttribute( 'disabled','disabled' );
}
function readFile()
{
var file = document.getElementById("file").files[0];
var reader = new FileReader();
reader.onload = function(e)
{
result.innerHTML = '<img src="'+this.result+'" alt=""/>'
alert("load");
}
reader.onprogress = function(e)
{
alert("progress");
}
reader.onabort = function(e)
{
alert("abort");
}
reader.onerror = function(e)
{
alert("error");
}
reader.onloadstart = function(e)
{
alert("loadstart");
}
reader.onloadend = function(e)
{
alert("loadend");
}
reader.readAsDataURL(file);
}
</script>
<p>
<label>請選擇一個圖像檔案:</label>
<input type="file" id="file" />
<input type="button" value="顯示圖像" onclick="readFile()" />
</p>
<div name="result" id="result">
<!-- 這裡用來顯示讀取結果 -->
</div>