Js中的FileReader相關(guān)操作方法總結(jié)
前言
FileReader是js中一種異步讀取文件的對(duì)象,它可以將文件內(nèi)容按照不同格式讀取,在談?wù)揊ileReader對(duì)象前,先來介紹兩個(gè)對(duì)象,Blob對(duì)象和File對(duì)象.
Blob對(duì)象
Blob 對(duì)象表示一個(gè)不可變、原始數(shù)據(jù)的類文件對(duì)象。也就是說,Blob對(duì)象一經(jīng)定義,就不能再被修改了。
如何構(gòu)建一個(gè)Blob對(duì)象?
通過構(gòu)造函數(shù)構(gòu)建
let blob = new Blob(["Hello"], {type: "text/plain"})
console.log(blob)
//返回值為:
// Blob {size: 7, type: 'text/plain'}接下來我們分別來解釋這兩個(gè)參數(shù)的意義:
第一個(gè)參數(shù): 接收一個(gè)數(shù)組(array),數(shù)組中可以存放任何類型的數(shù)據(jù),這些數(shù)據(jù)都會(huì)被存入Blob中。
第二個(gè)參數(shù): 接收一個(gè)對(duì)象,該對(duì)象為可選對(duì)象,該對(duì)象中包含了兩個(gè)屬性:
type屬性: 將會(huì)被存儲(chǔ)到blob中的MIME數(shù)據(jù)類型(一種標(biāo)識(shí)文件數(shù)據(jù)類型的方式),如type/plain,type/html,image/jpeg等。
endings屬性: 指定在Blob為文本形式時(shí)如何處理結(jié)尾符,該參數(shù)只對(duì)存儲(chǔ)文本數(shù)據(jù)的Blob對(duì)象有效,對(duì)二進(jìn)制的Blob對(duì)象無效。
Blob相關(guān)的屬性和操作
Blob對(duì)象有兩個(gè)屬性,分別為Size和type
let blob = new Blob(["Hello", "1", 1], {type: "text/html"})
//獲取blob中存儲(chǔ)的數(shù)據(jù)總長(zhǎng)度
console.log(blob.size)
//獲取blob中存儲(chǔ)數(shù)據(jù)類型
//這里的數(shù)據(jù)類型實(shí)質(zhì)上僅為了標(biāo)識(shí)存儲(chǔ)類型,算是一種約定
console.log(blob.type)Blob對(duì)象有以下操作函數(shù),這些操作函數(shù)提供了方便的API去操作Blob的數(shù)據(jù)
let blob = new Blob(["Hello", "1", 1], {type: "text/plain"})
/**
* text()方法
* text方法返回一個(gè)Promise對(duì)象,通過獲取返回值得到Blob中存儲(chǔ)的數(shù)據(jù)
* @return Promise
*/
blob.text().then(res => {
//返回值會(huì)將原先的數(shù)據(jù)全都合并起來
//返回:Hello11
console.log(res)
})
/**
* slice()方法
* slice方法會(huì)將Blob中的數(shù)據(jù)進(jìn)行切片,并返回一個(gè)新的Blob對(duì)象
* @param start:數(shù)據(jù)截取起始位置(包含)
* @param end: 數(shù)據(jù)截取終止索引位置(不包含)
* @param contentType/type: 分片后得到的新Blob對(duì)象內(nèi)存儲(chǔ)數(shù)據(jù)的類型,默認(rèn)為''
* @return Blob
*/
let newBlob = blob.slice(0, 3)
console.log(newBlob)
/**
* stream()方法
* stream方法會(huì)返回一個(gè)可讀流對(duì)象
* 該對(duì)象允許我們可以逐塊讀取Blob對(duì)象中的數(shù)據(jù)
* @return ReadableStream
*/
let readableStream = blob.stream();
let reader = readableStream.getReader();
reader.read().then(res => {
console.log(res)
//這里返回的數(shù)據(jù)為ASCII碼
// 我們可以通過訪問數(shù)組中的數(shù)據(jù)來做到分塊訪問
console.log(res.value)
console.log(String.fromCharCode(res.value[6]))//1
console.log(String.fromCharCode(res.value[0]))//H
})
/**
* arrayBuffer方法
* 以二進(jìn)制形式解析Blob對(duì)象的數(shù)據(jù),并返回一個(gè)Promise對(duì)象
* Arraybuffer對(duì)象表示一個(gè)通用原始的二進(jìn)制數(shù)據(jù)緩沖區(qū)
* @return Promise
*/
blob.arrayBuffer().then(res => {
console.log(res)//輸出一個(gè)ArrayBuffer對(duì)象
})File對(duì)象:特殊的Blob對(duì)象
File對(duì)象是一個(gè)特殊的Blob對(duì)象,通常用來標(biāo)識(shí)input上傳的單個(gè)文件的信息。
簡(jiǎn)單來說,File對(duì)象是Blob對(duì)象的子類。
關(guān)于File對(duì)象的操作非常少,以下是具體屬性和操作
/***
* @param fileBits:接受一個(gè)Array,Array中存儲(chǔ)Blob,ArrayBuffer,字符串等對(duì)象
* @param name:文件名
* @param options:{
* type:MIME類型,選擇文件的類型,
* lastModified: 文件最后修改時(shí)間
* }
* @type {File}
*/
let file=new File(["test"],"test.txt",{
type:"text/plain",
})
console.log(file)//獲取文件對(duì)象
console.log(file.lastModified)//獲取文件最后修改時(shí)間
console.log(file.lastModifiedDate)//獲取文件最后修改時(shí)間,使用Date對(duì)象存儲(chǔ)
console.log(file.name)//獲取文件名FileList對(duì)象
FileList對(duì)象簡(jiǎn)單來說就是存儲(chǔ)File對(duì)象的一個(gè)容器。通常,fileList需要我們通過訪問files數(shù)組獲取。
FileList具體的屬性如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<input type="file" id="file">
<script>
let files = document.getElementById("file")
files.addEventListener("change", (event) => {
//通過訪問files文件列表來獲取fileList對(duì)象
let fileList = event.target.files
console.log(fileList)//查看fileList對(duì)象
//使用fileList的API訪問指定索引的File對(duì)象
console.log(fileList.item(0))
})
</script>
</body>
</html>FileReader對(duì)象
鋪墊了這么長(zhǎng)時(shí)間,終于請(qǐng)出了這篇文章的正主,FileReader.
FileReader對(duì)象可以以異步的形式來訪問用戶上傳的文件
FileReader的三個(gè)屬性
error: 返回讀取時(shí)的錯(cuò)誤信息
readyState: 返回操作的當(dāng)前狀態(tài)
| 值 | 狀態(tài) | 描述 |
| 0 | EMPTY | reader被創(chuàng)建,但是沒有調(diào)用讀取方法 |
| 1 | LOADING | 讀取方法被調(diào)用 |
| 2 | DONE | 完成操作 |
result: 返回讀取文件的結(jié)果
具體的操作和屬性如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<input type="file" id="file">
<script>
let fileReader = new FileReader();
let files = document.getElementById("file")
files.addEventListener("change", (event) => {
let fileList = event.target.files
let file = fileList[0]
console.log(fileReader.readyState)//未調(diào)用函數(shù),返回0
/**
* 這里readAsText接受一個(gè)Blob對(duì)象,之前說過,File對(duì)象就是特殊的Blob對(duì)象
* 所以直接傳入file對(duì)象
* 這里readAsText用于將文件讀取為文本形式
* @param Blob 接受一個(gè)blob對(duì)象
* @param encoding 設(shè)置編碼格式
* @return undefined 該函數(shù)沒有返回值
* */
// fileReader.readAsText(file)
//調(diào)用終止函數(shù),終止文件讀取
// fileReader.abort()
/**
* readAsDataUrl方法
* 該方法會(huì)將文件讀取并最后返回一個(gè)基于Base64的URL到result屬性中
* 這里result中的url以data:開頭
* @param Blob 接受一個(gè)blob對(duì)象
* @return undefined
*/
// fileReader.readAsDataURL(file)
/**
* readAsArrayBuffer方法
* 該方法會(huì)將文件讀取并存儲(chǔ)為ArrayBuffer,最后返回一個(gè)ArrayBuffer數(shù)組到result中
* @param Blob 接受一個(gè)blob對(duì)象
* @return undefined
* */
fileReader.readAsArrayBuffer(file)
})
/**
* 該方法在讀取時(shí)調(diào)用
*/
fileReader.onloadstart = () => {
console.log("開始讀取")
console.log(fileReader.readyState)//調(diào)用函數(shù),但還沒有結(jié)束,返回1
}
/**
* 該方法在讀取成功時(shí)調(diào)用
*/
fileReader.onload = () => {
console.log("讀取成功")
console.log(fileReader.result)
console.log(fileReader.readyState)//調(diào)用完成,返回2
}
/**
* 該方法在讀取結(jié)束時(shí)調(diào)用
*/
fileReader.onloadend = () => {
console.log("讀取結(jié)束")
}
/**
* 讀取過程中觸發(fā)
*/
fileReader.onprogress = (e) => {
console.log("讀取中")
//獲取已經(jīng)加載的數(shù)據(jù)量
console.log("loaded==>" + e.loaded)
}
/**
* 該方法在調(diào)用abort函數(shù)時(shí)觸發(fā)
*/
fileReader.onabort = () => {
console.log("操作終止")
}
//當(dāng)讀取出現(xiàn)失敗時(shí)觸發(fā)
fileReader.onerror = () => {
console.log("出現(xiàn)錯(cuò)誤")
console.log(fileReader.error)
}
</script>
</body>
</html>URL.createObjectURL
該方法用于創(chuàng)建一個(gè)包含指定對(duì)象的臨時(shí)url,這個(gè)url的生命周期會(huì)和創(chuàng)建他的這個(gè)窗口的生命周期綁定,如果創(chuàng)建他的窗口被關(guān)閉了,那么這個(gè)url也就會(huì)失效。
一般來說,都會(huì)將File對(duì)象或者Blob對(duì)象作為參數(shù)傳入該函數(shù),并且讓這個(gè)臨時(shí)url來代表這些對(duì)象。
以下是一個(gè)案例:該案例根據(jù)用戶傳入的圖片文件,來生成一個(gè)對(duì)應(yīng)的臨時(shí)url,并將臨時(shí)url作為src傳給img標(biāo)簽
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<input type="file" id="file">
<img id="ig">
<script>
let file = document.getElementById("file")
let ig = document.getElementById("ig")
file.addEventListener("change", (e) => {
let fileList=e.target.files
//先獲取一份文件
//這里獲取的才是File對(duì)象
let file = fileList[0]
//因?yàn)閒ile也是Blob對(duì)象,所以直接傳入即可
ig.src=URL.createObjectURL(file)
})
</script>
</body>
</html>總結(jié)
到此這篇關(guān)于Js中FileReader相關(guān)操作方法的文章就介紹到這了,更多相關(guān)Js FileReader相關(guān)操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript數(shù)據(jù)類型的存儲(chǔ)方法詳解
JavaScript中基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是如何存儲(chǔ)的呢?下面通過本文給大家分享js數(shù)據(jù)類型的存儲(chǔ)方法,需要的朋友參考下吧2017-08-08
使用JavaScript和CSS實(shí)現(xiàn)簡(jiǎn)單的字符計(jì)數(shù)器
在本文中,你將學(xué)習(xí)如何使用?JavaScript?創(chuàng)建字符計(jì)數(shù)器。計(jì)數(shù)的數(shù)字可以在小顯示屏中看到。文中示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-08-08
原生JavaScript生成GUID的實(shí)現(xiàn)示例
GUID(全局統(tǒng)一標(biāo)識(shí)符)是指在一臺(tái)機(jī)器上生成的數(shù)字,下面為大家介紹下原生JavaScript生成GUID的實(shí)現(xiàn),需要的朋友不要錯(cuò)過2014-09-09
javascript禁止訪客復(fù)制網(wǎng)頁內(nèi)容的實(shí)現(xiàn)代碼
這篇文章主要介紹了javascript禁止訪客復(fù)制網(wǎng)頁內(nèi)容的方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08

