form表單的file文件上傳那些事

file API

客戶端直接訪問用戶計算機的文件,2000之前,在表單添加了<input type="file">字段.  
  file API是爲給web開發提供安全的方式,以便在客戶端更好訪問用戶的文件,字段的基礎上加
了一些直接訪問文件信息的接口-files集合.與fileReader類型讀取文件的數據.

files集合

name: 本地文件的名稱  
size: 文件的字節大小  
type: 字符、文件的MIME類型  
lastModifiedDate: 文件上次修改的時間(chrome實現了這屬性)

fileReader類型

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();

使用XHR上傳文件

//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

formdata append

new FormData(form? : HTMLFormElement);
給這對象加鍵值
append(name, value, filename);
name: 字段名稱
value: 字段數值
filename: 文件的文件名(可選).html

相關文章
相關標籤/搜索