客戶端直接訪問用戶計算機的文件,2000之前,在表單添加了<input type="file">字段. file API是爲給web開發提供安全的方式,以便在客戶端更好訪問用戶的文件,字段的基礎上加 了一些直接訪問文件信息的接口-files集合.與fileReader類型讀取文件的數據.
name: 本地文件的名稱 size: 文件的字節大小 type: 字符、文件的MIME類型 lastModifiedDate: 文件上次修改的時間(chrome實現了這屬性)
readAsText(file, encoding): 以純文本的方式讀取文件. readAsDataURL(file): 讀取文件並以URL的形式保存在result屬性中. readAsBinaryString(file): 讀取文件並將一個字符串將保存在result屬性中,一個字符 爲一個字節. readAsArrayBuffer(file): 讀取文件並將一個包含文件內容的ArrayBuffer保存在 result屬性中. (file-文件集合; encoding-編碼類型)
因爲數據是異步讀取.所以fileReader提供了幾種事件. progress事件: 每~50ms,便觸發一次. error事件: 但文件沒法讀取就會觸發,有個屬性error.code屬性.1表示未找到文件,2表示 安全性錯誤,3表示讀取中斷,4表示文件不可讀,5表示編碼錯誤. load事件: 觸發但文件完整讀取後. 中斷了還會觸發abort事件,在load、error事件後還會觸發loadend事件.
當用戶上傳完圖片以後,可在頁面當即顯示.
//html <label for="file"> <input type="file" name="file" id="file" accept="image/*"> <span id="output"></span> </label> //js function showFileImg(ele, dist){ const filesList = document.querySelector(ele); const output = document.querySelector(dist); filesList.addEventListener('change', function(event) { //實例fileReader對象 const reader = new FileReader(); //獲取文件集合 let files = event.target.files[0]; if(/image/.test(files.type)){ //讀取文件並經過URL類保存在result裏 reader.readAsDataURL(files); //事件 reader.onload = function(){ //得到圖片數據並插進顯示節點 let html = '<img src=' + reader.result + '>'; output.innerHTML = html; } } else { return false; } }); } const fileImgA = new showFileImg('#file', '#output');
讀取拖放文件,在建立自定義的位置,當用戶把文件拖放進自定義位置後,顯示文件信息.
//html <div id="drop_zone">Drop files here</div> <output id="output"></output> //js function dropFile() { const droptarget = document.querySelector('#drop_zone'); const output = document.querySelector('#output'); //文件信息 let info = ''; function handleEvent(event) { event.preventDefault(); let files, i, len; if(event.type == 'drop') { let files = event.dataTransfer.files; let i = 0; let len = files.length; //遍歷文件比放入顯示節點 while(i < len){ info += files[i].name + '(' + files[i].type + ',' + files[i].size + ')<br/>' i++; } output.innerHTML = info; } } droptarget.addEventListener('dragenter', handleEvent); droptarget.addEventListener('dragover', handleEvent); droptarget.addEventListener('drop', handleEvent); } dropFile();
//html <label for="file"> <input type="file" name="file" id="file"> </label> <button id="sendFile">提交</button> //js function xhrFile(){ const file = document.querySelector('#file'); const sendFile = document.querySelector('#sendFile'); //文件信息 let files; //得到文件信息 function getFileInfo(event){ let files = event.target.files[0]; }; //發送xhr function sendFileXhr(event){ //實例對象 let data = new FormData(); let i = 0; let len = files.length; //遍歷文件信息 while(i < len){ data.append('file' + i, files[i]); i++; } //實例請求對象 let xhr = new XMLHttpRequest(); xhr.open('post', '......php', true); //請求成功打印放回信息 xhr.onreadystatechange = function() { if(xhr.readystate === 4){ alert(xhr.responseText); } } xhr.send(data); }; } xhrFiles()
對象formData可經過鍵值模擬一系列的表單,經過xhr的send提交數據.php
new FormData(form? : HTMLFormElement);
給這對象加鍵值
append(name, value, filename);
name: 字段名稱
value: 字段數值
filename: 文件的文件名(可選).html