JS前端文件讀取FileReader操作方法總結(jié)
FileReader
FileReader 是一個對象,允許 Web 應(yīng)用程序異步讀取存儲在用戶計算機上的文件(或原始數(shù)據(jù)緩沖區(qū))的內(nèi)容,使用 File 或 Blob 對象指定要讀取的文件或數(shù)據(jù)。
構(gòu)造函數(shù):
let reader = new FileReader(); // 沒有參數(shù)
主要方法
readAsArrayBuffer(blob)
將數(shù)據(jù)讀取為二進制格式的 ArrayBuffer。當(dāng)讀取操作完成時,readyState 變成 DONE(已完成),并觸發(fā) loadend 事件,同時 result 屬性中將包含一個 ArrayBuffer 對象以表示所讀取文件的數(shù)據(jù)。
reader.readAsArrayBuffer(blob)
readAsText(blob, [encoding])
將數(shù)據(jù)讀取為給定編碼(默認(rèn)為 utf-8 編碼)的文本字符串。
instanceOfFileReader.readAsText(blob[, encoding]);
readAsDataURL(blob)
讀取二進制數(shù)據(jù),并將其編碼為 base64 的 data url。
reader.readAsDataURL(blob);
讀取方法都是異步的,也就是說只有當(dāng)執(zhí)行完成后才能夠查看到結(jié)果,如果直接查看是無結(jié)果的,并返回 undefined。必須要掛載 實例下的 onload 或 onloadend 的方法才能處理轉(zhuǎn)化后的結(jié)果
FileReader的三個屬性:
- error: 返回讀取時的錯誤信息
- readyState: 返回操作的當(dāng)前狀態(tài)
- result: 返回讀取文件的結(jié)果
讀取文件的示例:
參考 http://chabaoo.cn/javascript/3249569x8.htm
<input type="file" onchange="readFile(this)">
<script>
function readFile(input) {
let file = input.files[0];
let fileReader= new FileReader();
fileReader.readAsText(file);
// 或者 fileReader.readAsArrayBuffer(file)
/**
* 該方法在讀取時調(diào)用
*/
fileReader.onloadstart = () => {
console.log("開始讀取")
console.log(fileReader.readyState)//調(diào)用函數(shù),但還沒有結(jié)束,返回1
}
/**
* 該方法在讀取成功時調(diào)用
*/
fileReader.onload = () => {
console.log("讀取成功")
console.log(fileReader.result)
console.log(fileReader.readyState)//調(diào)用完成,返回2
}
/**
* 該方法在讀取結(jié)束時調(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ù)時觸發(fā)
*/
fileReader.onabort = () => {
console.log("操作終止")
}
//當(dāng)讀取出現(xiàn)失敗時觸發(fā)
fileReader.onerror = () => {
console.log("出現(xiàn)錯誤")
console.log(fileReader.error)
}
}
</script>
read 方法的選擇tips:
readAsArrayBuffer—— 用于二進制文件,執(zhí)行低級別的二進制操作。對于諸如切片(slicing)之類的高級別的操作,F(xiàn)ile 是繼承自 Blob 的,所以可以直接調(diào)用它們,而無需讀取。readAsText—— 用于文本文件,當(dāng)我們想要獲取字符串時。readAsDataURL—— 用于在 src 中使用此數(shù)據(jù),并將其用于img或其他標(biāo)簽時。還有一種用于此的讀取文件的替代方案:
URL.createObjectURL(file)。
示例:根據(jù)用戶傳入的圖片文件,來生成一個對應(yīng)的臨時url,并將臨時url作為src傳給img標(biāo)簽
<input type="file" id="file">
<img id="img">
let file = document.getElementById("file")
let img= document.getElementById("img")
file.addEventListener("change", (e) => {
let fileList=e.target.files
//先獲取一份文件
//這里獲取的才是File對象
let file = fileList[0]
//因為file也是Blob對象,所以直接傳入即可
img.src=URL.createObjectURL(file)
})
主要事件
讀取過程中,有以下事件:
- loadstart —— 開始加載。
- progress —— 在讀取過程中出現(xiàn),當(dāng)FileReader讀取數(shù)據(jù)時,進度事件會定期觸發(fā)。
- load —— 讀取完成時觸發(fā),沒有 error。
- abort —— 在中止讀取時會觸發(fā) abort 事件:例如程序調(diào)用 abort()。。
- error —— 出現(xiàn) error時觸發(fā)。
- loadend —— 讀取完成,無論成功還是失敗。
讀取完成后,可以通過以下方式訪問讀取結(jié)果:
- reader.result 是結(jié)果(如果成功)
- reader.error 是 error(如果失敗)。
檢測瀏覽器對 FileReader 的支持:
if(window.FileReader) {
var fr = new FileReader();
// add your code here
}else {
alert("Not supported by your browser!");
}
React + antd Upload 組件示例
場景: 表單文件上傳,讀取后以base64格式與表單一起傳給后端。
<Upload
maxCount={1}
accept=".jpg,.jpeg,.png"
beforeUpload={(file) => {
console.log('文件類型', file.type, file);
// 限制文件類型
const allowTypes = [
'image/png',
'image/jpeg',
'image/jpg',
];
const isAllowType = allowTypes.includes(file.type);
// 校驗文件大小和類型
if (!isAllowType || file.size / 1024 / 1024 > 4) {
message.error('文件格式大小錯誤');
return Upload.LIST_IGNORE;
}
const reader = new FileReader();
//將上傳的文件讀取成base64
reader.readAsDataURL(file);
reader.onloadend = function () {
console.log('文件Base64內(nèi)容',reader.result, file);
};
// 阻止上傳,為了最后和表單一起提交
return false;
}}
>
<Button icon={<UploadOutlined />} type="primary">
文件上傳
</Button>
</Upload>總結(jié)
到此這篇關(guān)于JS前端文件讀取FileReader操作方法總結(jié)的文章就介紹到這了,更多相關(guān)JS前端文件讀取FileReader內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript將字符轉(zhuǎn)換為ASCII碼的實現(xiàn)方法
在Web前端開發(fā)中,字符編碼是處理文本數(shù)據(jù)時不可或缺的一部分,ASCII是一種廣泛使用的字符編碼標(biāo)準(zhǔn),它為每個字符分配了一個唯一的數(shù)字表示,解如何將字符轉(zhuǎn)換為ASCII碼,對于解析、生成和操作字符串具有重要意義,本文將詳細(xì)介紹這一過程,并提供多個實用的代碼示例2024-12-12
JavaScript實現(xiàn)LI列表數(shù)據(jù)綁定的方法
這篇文章主要介紹了JavaScript實現(xiàn)LI列表數(shù)據(jù)綁定的方法,可實現(xiàn)綁定Li列表項對應(yīng)數(shù)值項的功能,涉及javascript鼠標(biāo)onmousemove、onmouseout及onclick等事件的相關(guān)使用技巧,需要的朋友可以參考下2015-08-08

