EventUtil = {
addHandler: function (obj, event, handler) {
if (obj.addEventListener) {
obj.addEventListener(event, handler, false);
} else if (obj.attachEvent) {
obj.attachEvent('on' + event, handler);
} else {
obj['on' + event] = handler;
}
},
removeHandler: function (obj, event, handler) {
if (obj.removeEventListener) {
obj.removeEventListener(event, handler, false);
} else if (obj.detachEvent) {
obj.detachEvent('on' + event, handler);
} else {
obj['on' + event] = null;
}
}
};
File API
File API在表單中的文件輸入字段的基礎上,又添加了一些直接訪問文件信息的接口。H5在DOM中爲文件輸入元素添加了一個files集合,在通過文本輸入字段選擇了一或多個文件時,files集合中將包含一組File對象,每個File對象對應着一個文件。每個File對象都有下列只讀屬性。注意監測的事件: change
- name: 本地文件系統的文件名
- size: 文件的字節大小
- type:字符串,文件的MIME類型。
- lastModifiedDate:字符串,文件上一次被修改的事件
window.onload = function(){
var filesList = document.getElementById('files-list');
EventUtil.addHandler(filesList,'change',function(e){
var files = this.files,
i = 0,
len = files.length;
while(i<len){
console.log(files[i].name + '('+files[i].type+','+files[i].size +'bytes)');
console.log('files.name :'+files[i].name );
console.log('files.type :'+files[i].type );
console.log('files.size :'+files[i].size );
console.log('files.lastModifiedDate :'+files[i].lastModifiedDate );// lastModifiedDate 上一次修改文件的時間 chrome實現了這個功能
i++;
}
})
};<div class="container"> <label>請選擇一個文件:</label> <input type="file" id="files-list" multiple/> </div> 運行結果: 我上傳了一個live.js,顯示如下面所示:
FileReader類型
FlieReader類型實現的是一種異步文件讀取機制。可以把FileReader想象成XMLHttpRequest,區別只是它讀取的是文件,而不是遠程服務器。爲了讀取文件中的數據,FileReader提供瞭如下幾個方法:
- readAsText(file, encoding):以純文本的形式讀取文件,將讀取到的文本保存在result屬性中。
- readAsDataURL(file):讀取文件並將文件一數據URI的形式保存在result屬性中
- readAsBinaryString(file)(已廢棄):讀取文件並將一個字符串保存在result屬性中,字符串中的每一個字符表示一字節
- readAsArrayBuffer(file):讀取文件並將一個包含文件內容的ArrayBuffer保存在result屬性中。
由於讀取過程是異步的,因此FileReader也提供了幾個事件。其中最有用的三個事件是progress、error和load,分別表示是否又讀取了新數據,是否發生了錯誤以及是否讀完了整個文件。
window.onload = function(){
var input = document.getElementById("file_input");
var result,div;
if(typeof FileReader==='undefined'){
alert('你的瀏覽器不支持')
//result.innerHTML = "抱歉,你的瀏覽器不支持 FileReader";
input.setAttribute('disabled','disabled');
}else{
input.addEventListener('change',readFile,false);
}
function readFile(){
for(var i=0;i<this.files.length;i++){
//單詞上傳只走了一次,觸發一次file事件就執行一次,多次上傳會走上傳數目的圖片
//判斷上傳文件格式
if (!input['value'].match(/.jpg|.gif|.png|.bmp/i)){
return alert("上傳的圖片格式不正確,請重新選擇")
}
//聲明一個FileReader實例
var reader = new FileReader();
//調用readAsDataURL方法來讀取選中的圖像文件
reader.readAsDataURL(this.files[i]);
//最後在onload事件中,獲取到成功讀取的文件內容,並以插入一個img節點的方式顯示選中的圖片
reader.onload = function(e){
result = '<div id="result"><img src="'+this.result+'" alt=""/></div>';
div = document.createElement('div');
div.innerHTML = result;
document.getElementById('body').appendChild(div); //插入dom樹
}
}
}
}
function blobSlice(blob,startByte,length){
if(blob.slice){
return blob.slice(startByte,length);
} else if(blob.webkitSlice){
return blob.webkitSlice(startByte,length);
} else if(blob.webkitSlice){
return blob.webkitSlice(startByte,length);
} else {
return null;
}
}
var filesList = document.getElementById('files-list');
EventUtil.addHandler(filesList, "change", function(event){
var info = "",
output = document.getElementById("output"),
progress = document.getElementById("progress"),
files = EventUtil.getTarget(event).files,
type = "default",
reader = new FileReader();
blob = blobSlice(files[0],0,32);
if (blob){
reader.readAsText(blob);
reader.onerror = function(){
outpit.innerHTML = 'could not read file,error code is' + reader.error.code;
}
reader.onload = function(){
output.innerHTML = reader.result;
};
} else {
alert('your browser does not support slice()');
}
reader.onerror = function(){
output.innerHTML = "Could not read file, error code is " + reader.error.code;
};
對象URL對象URL也被稱爲blob URL,指的是引用保存在File或Blob中數據的URL。使用對象URL的好處是可以不必把文件內容讀取到JavaScript中而直接使用文件內容。爲此,只要在需要文件內容的地方提供對象URL即可。要創建對象URL,可以使用window.URL.createObjectURL()方法,並傳入File或Blob對象。這個方法在Chrome中的實現叫window.webkitURL.createObjectURL(),因此可以通過如下函數來消除命名的差異:
function createObjectURL(blob){
if(window.URL){
return window.URL.createObjectURL(blob);
} else if (window.webkitURL) {
return window.webkitURL.createObjectURL(blob);
} else {
return null;
}
}
var filesList = document.getElementById("files-list");
EventUtil.addHandler(filesList, "change", function(event){
var info = "",
output = document.getElementById("output"),
progress = document.getElementById("progress"),
files = EventUtil.getTarget(event).files,
type = "default",
reader = new FileReader();
url = createObjectURL(files[0]);
if(url) {
if (/image/.test(files[0].type)){
output.innerHTML="<img src =\"" + url + "\">"
} else {
output.innerHTML = 'not an image';
}
} else {
output.innerHTML = "your browser doesn't support object URLs";
}
});
reader.onerror = function(){
output.innerHTML = "Could not read file, error code is " + reader.error.code;
};
reader.onprogress = function(event){
if (event.lengthComputable){
progress.innerHTML = event.loaded + "/" + event.total;
}
};