通過HTML5實現(xiàn)多文件上傳以及本地預(yù)覽

在HTML5之前,通過<input type="file">一次只能上傳一個文件,大部分多文件上傳都是通過flash實現(xiàn)得(聽說得,我沒用過),但是有了HTML5,多文件上傳變得非常簡單,并且可以本地預(yù)覽。之前寫過一個模仿QQ風(fēng)格的移動端表單,支持多文件上傳(圖片),并且可以本地預(yù)覽。已放在GitHub[感興趣的點這里],沒有維護(hù),對它的外觀不要介意。

多文件上傳

說了這么多,多文件上傳要怎么實現(xiàn)呢?

<input type="file“ multiple  >

只要加了multiple 屬性,該input就支持多文件上傳了,但是我們要怎么拿到上傳的文件呢?
HTML5提供了相應(yīng)的FileList對象,file對象有相應(yīng)的屬性,如name 、type、lastModifiedDate. 看個代碼就明白了

<input type="file" id="upload" multiple >
<script>
    var Upload=document.getElementById("upload");
    var formData=new FormData(); //通過FormData對象可以組裝一組用 [XMLHttpRequest]發(fā)送請求的鍵/值對,它可以更靈活方便的發(fā)送表單數(shù)據(jù)。
    Upload.onchange=function(){  //onchange在你選擇完文件時觸發(fā)
          var fileList=Upload.files ; //通過input的files屬性獲得fileList
          for(let i=0;i<fileList.length;i++)
          {  

                 var file=fileList[i];
                 //比如在這里可以檢查文件類型是不是圖片
                 if(!/image\/w+/.test(file.type))
                 {
                           alert("請上傳圖片文件!”);
                           return ;
                 }
                 formData.append("file"+i,file);  //key:"file"+i,value:file,然后就可以把formData post到后臺了
                 console.log(file.name+file.lastModifiedDate);
          }
    }
</script>

效果如圖

image.png

但是要注意,多文件上傳是指你可以一次性添加多個文件,但是如果你添加了一個文件后,再次打開添加,之前的就被清空了,如果場景需要多次添加,可以每次把相關(guān)信息自己記下來,然后自己提示用戶已添加的文件。(看到這里,可能有的人說既然這樣,HTML5多文件上傳有什么意義,我本來就可以這樣一個個記下來再上傳,但是這個用戶體驗很不好,試想你微信發(fā)朋友圈,添加九張圖片,一次性添加好,還是一張張加好呢?或者你添加了幾個文件后,已經(jīng)關(guān)了,但是突然發(fā)現(xiàn)漏掉一個文件,你不總能再把之前的重新再上傳一遍吧,所以每上傳一個文件,把它記下來是很有必要的)而且時候我們不一定添加的都是同類型文件,所以一次性添加多個文件不是很方便。

本地預(yù)覽,以圖片為例

本地預(yù)覽主要依賴FileReader對象,F(xiàn)ileReader對象用于把文件讀入內(nèi)存
FileReader 對象的方法和事件

Method

  • readAsBinaryString(file對象或者blob對象) 將文件讀取為二進(jìn)制
  • readAsText(file對象或者blob對象) 將文件讀取為文本數(shù)據(jù)
  • readAsDataURL(file對象或者blob對象) 將文件讀取為DataURL
  • readAsArrayBuffer(file對象或者blob對象) 將文件讀取ArrayBuffer
  • abort 中止讀取

Event

  • onabort 數(shù)據(jù)讀取中斷時觸發(fā)

  • onerror 數(shù)據(jù)讀取出錯是觸發(fā)

  • onloadstart 數(shù)據(jù)讀取開始時觸發(fā)

  • onprogress 數(shù)據(jù)讀取中

  • onload 數(shù)據(jù)讀取成功完成時觸發(fā)

  • onloadend 數(shù)據(jù)讀取完成時觸發(fā),不論成功或失敗
    圖像預(yù)覽示例

    <input type="file" accept="image/*" id="upload">
    <div id="preview"></div>
    <script>
        var oPreview=document.getElementById("preview");
        var oUpload=document.getElementById("upload");
        oUpload.onchange=function(){
              var imageFile=oUpload.files[0];
              var reader=new FileReader();
              reader.readAsDataURL(imageFile);
              reader.onload=function(e){
                       oPreview.innerHTML="![]("+this.result+")"; //this.result就是URL
              }
        }  
    </script>
    

    上面的例子是本地預(yù)覽圖片,在網(wǎng)頁上通過img標(biāo)簽展示出來,同時也可以預(yù)覽文本文件等。但是本地預(yù)覽的應(yīng)用不僅僅如此,你可以在文件上傳到后臺之前,對它做任何操作,一個常見的場景就是壓縮圖片,手機(jī)拍的照片通常都在2M以上,我們往往需要提前壓縮再給后臺,這樣可以大大節(jié)省帶寬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡介 HTML5 終于為我們提供了一種通過 File API 規(guī)范與本地文件交互的標(biāo)準(zhǔn)方式。為了舉例說明其功能,可...
    ddai_Q閱讀 2,958評論 1 5
  • 在javascript的世界里無法處理二進(jìn)制數(shù)據(jù),如果需要處理,只能使用charCodeAt()方法,一個個字節(jié)地...
    我是上帝可愛多閱讀 960評論 0 4
  • 前言 HTML5 中提供的文件API在前端中有著豐富的應(yīng)用,上傳、下載、讀取內(nèi)容等在日常的交互中很常見。而且在各個...
    linshuai閱讀 934評論 0 11
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 14,307評論 0 15
  • 一天,小雞悶在家里覺得很無聊,就到外面去找朋友玩。 小雞找到了小猴家,對小猴說:“猴哥,我們交朋友好嗎?”小猴說:...
    7念白閱讀 798評論 0 0

友情鏈接更多精彩內(nèi)容