校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > HTML5 FileReader對象的具體使用方法

HTML5 FileReader對象的具體使用方法

熱門標簽:只辦理400電話 拓展地圖標注 高德地圖標注地點糾錯 電話機器人黑斑馬免費 電話機器人電銷系統(tǒng)掙話費 平涼地圖標注位置怎么弄 機器人外呼系統(tǒng)存在哪些能力 如何獲取地圖標注客戶 南昌仁和怎么申請開通400電話

寫在前面

前一篇文章介紹了HTML5中的Blob對象(詳情戳這里),從中了解到Blob對象只是二進制數(shù)據(jù)的容器,本身并不能操作二進制,故本篇將對其操作對象FileReader進行介紹。

FileReader

FileReader主要用于將文件內容讀入內存,通過一系列異步接口,可以在主線程中訪問本地文件。

使用FileReader對象,web應用程序可以異步的讀取存儲在用戶計算機上的文件(或者原始數(shù)據(jù)緩沖)內容,可以使用File對象或者Blob對象來指定所要處理的文件或數(shù)據(jù)。

創(chuàng)建實例

var reader = new FileReader();

方法

方法定義 描述
abort():void 終止文件讀取操作
readAsArrayBuffer(file):void 異步按字節(jié)讀取文件內容,結果用ArrayBuffer對象表示
readAsBinaryString(file):void 異步按字節(jié)讀取文件內容,結果為文件的二進制串
readAsDataURL(file):void 異步讀取文件內容,結果用data:url的字符串形式表示
readAsText(file,encoding):void 異步按字符讀取文件內容,結果用字符串形式表示

事件

事件名稱 描述
onabort 當讀取操作被中止時調用
onerror 當讀取操作發(fā)生錯誤時調用
onload 當讀取操作成功完成時調用
onloadend 當讀取操作完成時調用,不管是成功還是失敗
onloadstart 當讀取操作將要開始之前調用
onprogress 在讀取數(shù)據(jù)過程中周期性調用

使用方法

FileReader通過異步的方式讀取文件內容,結果均是通過事件回調獲取,下面是一個讀取本地txt文件內容的例子:

var input  = document.getElementById("file"); //input file
input.onchange = function(){
    var file = this.files[0];
    if(!!file){
        //讀取本地文件,以gbk編碼方式輸出
        var reader = new FileReader();
        reader.readAsText(file,"gbk");
        reader.onload = function(){
            //讀取完畢后輸出結果
            console.log(this.result);
        }
    }
}

此外我們還可以通過注冊onprogress、onerror等事件,記錄文件讀取進度或異常行為等等。

讀取方式

FileReader提供了四種不同的讀取文件的方式,如:readAsArrayBuffer會將文件內容讀取為ArrayBuffer對象,readAsBinaryString則將文件讀取為二進制串,下面對這四種方式進行簡單區(qū)分。

首先準備一張圖片(6764 字節(jié))和一個txt文本(51字節(jié))作為測試文件:

接著編寫測試代碼:

 var reader = new FileReader();
// 通過四種方式讀取文件
//reader.readAsXXX(file);   
reader.onload = function(){
    //查看文件輸出內容
    console.log(this.result);
    //查看文件內容字節(jié)大小
    console.log(new Blob([this.result]))
}

readAsDataURL

查看圖片輸出結果:

查看txt輸出結果:

很明顯,readAsDataURL會將文件內容進行base64編碼后輸出,這個很好區(qū)分。

readAsText

此方法可以通過不同的編碼方式讀取字符,我們使用utf-8讀取

查看圖片輸出結果:

查看txt輸出結果:

readAsText讀取文件的單位是字符,故對于文本文件,只要按規(guī)定的編碼方式讀取即可;
而對于媒體文件(圖片、音頻、視頻),其內部組成并不是按字符排列,故采用readAsText讀取,會產生亂碼,同時也不是最理想的讀取文件的方式

readAsBinaryString

查看圖片輸出結果:

查看txt輸出結果:

與readAsText不同的是,readAsBinaryString函數(shù)會按字節(jié)讀取文件內容。
然而諸如0101的二進制數(shù)據(jù)只能被機器識別,若想對外可見,還是需要進行一次編碼,而readAsBinaryString的結果就是讀取二進制并編碼后的內容。
盡管readAsBinaryString方法可以按字節(jié)讀取文件,但由于讀取后的內容被編碼為字符,大小會受到影響,故不適合直接傳輸,也不推薦使用。
如:測試的圖片文件原大小為6764 字節(jié),而通過readAsBinaryString讀取后,內容被擴充到10092個字節(jié)

readAsArrayBuffer

查看圖片輸出結果:

查看txt輸出結果:

與readAsBinaryString類似,readAsArrayBuffer方法會按字節(jié)讀取文件內容,并轉換為ArrayBuffer對象。
我們可以關注下文件讀取后大小,與原文件大小一致。
這也就是readAsArrayBuffer與readAsBinaryString方法的區(qū)別,readAsArrayBuffer讀取文件后,會在內存中創(chuàng)建一個ArrayBuffer對象(二進制緩沖區(qū)),將二進制數(shù)據(jù)存放在其中。通過此方式,我們可以直接在網絡中傳輸二進制內容。
好了說這么多,那ArrayBuffer到底是個毛?
關于ArrayBuffer對象牽涉的知識點比較多,完全可以單開一篇細說,在此只要簡單理解為存放了一段二進制數(shù)據(jù)的內存空間即可。
而本身ArrayBuffer中的內容對外是不可見的,若要查看其中的內容,就要引入另一個概念:類型化數(shù)組
我們可以嘗試查看下剛剛通過readAsArrayBuffer方法讀取的圖片文件內容:

可以看到,整個圖片文件的6764個字節(jié),被分別存儲在長度為6764的數(shù)組中,而數(shù)組中每一個元素的值,為當前字節(jié)的十進制數(shù)值。
關于ArrayBuffer和類型化數(shù)組的概念在此不做深入解釋,之后會再寫一篇單獨討論。

應用場景

說了這么多,最后還是要落實到FileReader能解決什么問題,下面通過幾個例子說明:

在線預覽本地文件

我們知道,img的src屬性或background的url屬性,可以通過被賦值為圖片網絡地址或base64的方式顯示圖片。
在文件上傳中,我們一般會先將本地文件上傳到服務器,上傳成功后,由后臺返回圖片的網絡地址再在前端顯示。
通過FileReader的readAsDataURL方法,我們可以不經過后臺,直接將本地圖片顯示在頁面上。這樣做可以減少前后端頻繁的交互過程,減少服務器端無用的圖片資源,代碼如下:

var input  = document.getElementById("file");   // input file
input.onchange = function(){
    var file = this.files[0];
        if(!!file){
            var reader = new FileReader();
            // 圖片文件轉換為base64
            reader.readAsDataURL(file);
            reader.onload = function(){
                // 顯示圖片
                document.getElementById("file_img").src = this.result;
        }
    }
}

運行效果如下:

對于圖片上傳,我們也可以先將圖片轉換為base64進行傳輸,此時由于傳輸?shù)膱D片內容就是一段字符串,故上傳接口可以當做普通post接口處理,當圖片傳輸?shù)胶笈_后,可以在轉換為文件實體存儲。
當然,考慮到base64轉換效率及其本身的大小,本方法還是適合于上傳內容簡單或所占內存較小的文件。

二進制數(shù)據(jù)上傳

HTML5體系的建立引入了一大堆新的東西,基于XHR2,我們可以直接上傳或下載二進制內容,無需像以往一樣通過form標簽由后端拉取二進制內容。
簡單整理下上傳邏輯:
1、通過input[type="file"]標簽獲取本地文件File對象
2、通過FileReader的readAsArrayBuffer方法將File對象轉換為ArrayBuffer
3、創(chuàng)建xhr對象,配置請求信息
4、通過xhr.sendAsBinary直接將文件的ArrayBuffer內容裝填至post body后發(fā)送
代碼實現(xiàn)如下:

var input  = document.getElementById("file");   // input file
input.onchange = function(){
    var file = this.files[0];
        if(!!file){
            var reader = new FileReader();
            reader.readAsArrayBuffer(file);
            reader.onload = function(){
                var binary = this.result;
                upload(binary);
        }
    }
}

//文件上傳
function upload(binary){
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://xxxx/opload");
    xhr.overrideMimeType("application/octet-stream");
    //直接發(fā)送二進制數(shù)據(jù)
    if(xhr.sendAsBinary){
        xhr.sendAsBinary(binary);
    }else{
        xhr.send(binary);
    }
    
    // 監(jiān)聽變化
    xhr.onreadystatechange = function(e){
        if(xhr.readyState===4){
            if(xhr.status===200){
                // 響應成功       
            }
        }
    }
}

總結

本篇主要介紹了FileReader對象的屬性及應用場景,有了FileReader,我們可以將本地文件讀取到內存中。文中我們提到了ArrayBuffer和類型化數(shù)組的概念,這使得我們可以在內存中進一步操作二進制數(shù)據(jù),關于這部分內容,會在之后的博客中進行歸納。

參考資料

[1] MDN_FileReader
[2] Unicode 和 UTF-8 有何區(qū)別

到此這篇關于HTML5 FileReader對象的具體使用方法的文章就介紹到這了,更多相關HTML5 FileReader對象內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持腳本之家!

標簽:池州 遼源 西藏 永州 漯河 青島 新疆 棗莊

巨人網絡通訊聲明:本文標題《HTML5 FileReader對象的具體使用方法》,本文關鍵詞  HTML5,FileReader,對象,的,具體,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《HTML5 FileReader對象的具體使用方法》相關的同類信息!
  • 本頁收集關于HTML5 FileReader對象的具體使用方法的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    免费久久99精品国产| 午夜久久电影网| 在线精品视频免费播放| 蓝色福利精品导航| 樱桃国产成人精品视频| 精品国产一区二区亚洲人成毛片 | 欧美v日韩v国产v| 色综合久久六月婷婷中文字幕| 日本成人在线网站| 亚洲伦理在线精品| 国产亚洲一本大道中文在线| 欧美精三区欧美精三区| 色婷婷综合久久久久中文一区二区 | 国内精品视频一区二区三区八戒| 亚洲另类春色校园小说| 久久久不卡网国产精品二区| 欧美一区二区高清| 欧美中文字幕一区二区三区| 99久免费精品视频在线观看| 国产在线视频一区二区| 视频一区国产视频| 一区二区三区精品视频在线| 国产精品女上位| 精品国精品自拍自在线| 欧美二区乱c少妇| 欧美视频一区在线观看| 9l国产精品久久久久麻豆| 久久99国产精品麻豆| 日本中文字幕一区二区有限公司| 亚洲一级二级三级在线免费观看| 亚洲免费av高清| 亚洲视频一区二区在线| 国产精品久久午夜| 国产欧美日韩精品a在线观看| 欧美精品一区二区久久婷婷| 日韩一二在线观看| 欧美一区二区啪啪| 欧美一区二区三区免费大片| 日韩一区二区在线观看视频| 日韩丝袜情趣美女图片| 欧美一级片在线看| 欧美tickling网站挠脚心| 日韩免费在线观看| 精品少妇一区二区三区日产乱码| 精品少妇一区二区三区免费观看| 久久免费午夜影院| 2021国产精品久久精品| 久久九九99视频| 国产日产亚洲精品系列| 国产精品日韩精品欧美在线| 中文一区一区三区高中清不卡| 国产精品网站在线播放| 亚洲欧洲99久久| 亚洲午夜精品17c| 日韩精品一二区| 久久99热这里只有精品| 国产一区二区三区精品视频| 丰满亚洲少妇av| 91极品视觉盛宴| 欧美精品aⅴ在线视频| 欧美一区二区三区免费在线看| 日韩精品最新网址| 中文成人综合网| 亚洲一区二区三区自拍| 欧美亚洲国产一区在线观看网站 | 久久在线观看免费| 成人免费三级在线| 国产在线国偷精品免费看| 日本特黄久久久高潮| 亚洲精品乱码久久久久久久久| 久久精品水蜜桃av综合天堂| 26uuu另类欧美| 中文一区二区完整视频在线观看| 久久久久久久综合狠狠综合| 国产精品福利一区| 欧美日韩一级二级| 日韩视频免费观看高清完整版在线观看| 欧美一区二区日韩| 欧美激情一区二区三区| 一区二区三区欧美在线观看| 日本 国产 欧美色综合| 床上的激情91.| 欧美猛男男办公室激情| 久久久久久夜精品精品免费| 亚洲精品免费一二三区| 蜜桃av一区二区三区| 成人h动漫精品一区二区 | 91丨porny丨中文| 在线不卡中文字幕播放| 国产欧美精品在线观看| 午夜欧美视频在线观看| 在线观看国产91| 日韩欧美激情在线| 一区二区三区四区视频精品免费| 激情六月婷婷久久| 欧美亚洲国产一区二区三区va| 国产亚洲女人久久久久毛片| 亚洲国产综合视频在线观看| 国产成人av一区二区三区在线 | 欧美午夜在线一二页| 久久久久久99精品| 婷婷成人激情在线网| av一区二区三区黑人| 日韩免费一区二区三区在线播放| 中文字幕一区二区不卡| 久草中文综合在线| 欧美专区亚洲专区| 亚洲天堂免费在线观看视频| 国产一区二区三区免费观看| 欧美人伦禁忌dvd放荡欲情| 综合电影一区二区三区| 国产成人av电影在线播放| 日韩一区二区三| 亚洲第一福利视频在线| 99精品国产99久久久久久白柏| 久久夜色精品国产欧美乱极品| 五月婷婷另类国产| 日本韩国精品在线| 中文字幕在线一区| 国产精品1024| 久久美女高清视频| 青草av.久久免费一区| 国产精品五月天| 在线精品视频免费播放| 国产1区2区3区精品美女| 欧美www视频| 国产精品一区二区三区99| 国产欧美一区二区三区在线老狼| 日韩av不卡在线观看| 日韩欧美专区在线| 国产在线观看免费一区| 国产日韩在线不卡| 不卡大黄网站免费看| 久久精品72免费观看| 粉嫩av一区二区三区粉嫩| 日韩一区二区在线免费观看| 人人精品人人爱| 日韩午夜激情电影| 毛片av一区二区三区| 日韩欧美久久一区| 成人一区二区视频| 亚洲国产精品99久久久久久久久| 国产精品亚洲第一区在线暖暖韩国 | 不卡视频在线观看| 亚洲欧洲日韩av| 91黄色小视频| 天天影视涩香欲综合网| 欧美一区在线视频| 精品一区二区免费| 久久久综合网站| 国产成人免费av在线| 亚洲色图第一区| 欧美日韩在线三区| 日本va欧美va瓶| 久久奇米777| 99免费精品在线| 亚洲h动漫在线| 久久综合久久综合久久| 成人午夜电影小说| 亚洲男人的天堂在线观看| 欧美视频日韩视频在线观看| 美国毛片一区二区| 国产日韩欧美精品综合| 91久久香蕉国产日韩欧美9色| 亚洲国产欧美在线| 精品成a人在线观看| av午夜一区麻豆| 午夜精品国产更新| 久久毛片高清国产| 色欧美片视频在线观看在线视频| 日韩国产欧美在线观看| 欧美国产精品一区| 欧美午夜精品一区| 国内久久精品视频| 亚洲精品国产无天堂网2021| 欧美疯狂做受xxxx富婆| 国产91精品欧美| 午夜精品久久一牛影视| 久久久亚洲高清| 欧美日韩在线亚洲一区蜜芽| 国产精品白丝jk黑袜喷水| 樱桃视频在线观看一区| 欧美成人精品1314www| 91在线视频播放| 久久国产精品第一页| 亚洲日本一区二区三区| 精品国产乱码久久久久久久久| 成a人片亚洲日本久久| 免费不卡在线观看| 亚洲天堂av老司机| wwwwxxxxx欧美| 欧美久久久久中文字幕| 99精品视频在线观看免费| 美女诱惑一区二区| 亚洲精品v日韩精品| 国产亚洲欧美日韩俺去了| 884aa四虎影成人精品一区| av午夜一区麻豆| 国产成人自拍在线| 日韩成人免费在线|