日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

学习File API用于前端读取文件

發(fā)布時(shí)間:2023/12/10 HTML 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习File API用于前端读取文件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. File API簡(jiǎn)介

File API對(duì)于某些專門的網(wǎng)站的不可或缺的。現(xiàn)在常用它實(shí)現(xiàn)對(duì)文件的預(yù)覽等功能。

File API規(guī)定怎么從硬盤上提取文件,直接交給在網(wǎng)頁中運(yùn)行中的Javascript代碼。然后代碼可以打開文件探究數(shù)據(jù),無論是本地文件還是其他文件。注意,關(guān)鍵在于文件會(huì)被直接交給JavaScript代碼,它并不能修改文件,也不能創(chuàng)建新文件,想要保存任何數(shù)據(jù),需要將數(shù)據(jù)發(fā)送到服務(wù)器或者保存在本地存儲(chǔ)空間中。

2. 讀取文件

在通過File API操作文件之前,首先必須取得文件。使用File API可以直接讀取文本文件的內(nèi)容。
例如:

<!DOCTYPE html> <html> <head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>文件上傳</title><style>#fileOutput {border:1px grey solid;width: 500px;}</style> </head> <body><input type="file" id="fileInput" onChange="processFiles(this.files)"><div id="fileOutput"></div> <script>function processFiles(files) {//每個(gè)文件對(duì)象都有三個(gè)有用的屬性:name屬性保存文件名,size屬性保存文件的字節(jié)大小,type保存文件的MEMI類型var file = files[0];//創(chuàng)建FileReader對(duì)象,var reader = new FileReader();//FileReader用來提取文件內(nèi)容,但是這個(gè)方法是異步的,要提取文件,首先要處理onLoad事件reader.onload = function(e) {//這個(gè)事件發(fā)生了,意味著數(shù)據(jù)準(zhǔn)備好了,//把它復(fù)制到頁面的div元素中var output = document.getElementById("fileOutput");//將文件內(nèi)容轉(zhuǎn)換成一個(gè)長字符串,保存在onload事件的e.target.result中output.textContent = e.target.result;};//調(diào)用FileReader的readAsText()方法reader.readAsText(file);} </script> </body> </html>


上圖中,選擇一個(gè)文件,無需上傳,網(wǎng)頁中的javascript代碼就能取得文本文件,把內(nèi)容復(fù)制到頁面中。

readAsText()方法只能處理文本內(nèi)容的文件,如CSV格式,XML格式,.docx格式和.xlsx格式的文件。
readAsText()方法只是眾多讀取文件的方法之一,還有readAsBinaryStrng(),readAsDataURL()和readAsArrayBuffer().

  • readAsBinaryStrng()方法可以讓應(yīng)用處理二進(jìn)制編碼的數(shù)據(jù),但基本上就是把數(shù)據(jù)保存在一個(gè)文本字符串中,效率不高。
  • readAsArrayBuffer()是對(duì)于做數(shù)據(jù)處理較好的選擇,這個(gè)方法將數(shù)據(jù)讀到一個(gè)數(shù)組中,每個(gè)數(shù)組項(xiàng)代表一字節(jié)數(shù)據(jù)。這套方案的優(yōu)勢(shì)是可以用來創(chuàng)建大塊數(shù)據(jù),然后切分成更小的二進(jìn)制數(shù)據(jù)塊,以便逐塊處理。
  • readAsDataURL()方法則讓我們能方便地取到圖片數(shù)據(jù)。

2.1 一次讀取多個(gè)文件

HTML5也支持一次提交多個(gè)文件,只要為<input>元素添加multiple屬性即可:

<input type="file" id="Files" name="files[]" multiple /> <div id="Lists"></div> function fileSelect(e) { e = e || window.event; var files = e.target.files; //FileList Objects var output = []; for(var i = 0, f; f = files[i]; i++) { output.push('<li><strong>' + f.name + '</strong>(' + f.type + ') - ' + f.size +' bytes</li>'); } document.getElementById('Lists').innerHTML = '<ul>' + output.join('') + '</ul>'; } if(window.File && window.FileList && window.FileReader && window.Blob) { document.getElementById('Files').addEventListener('change', fileSelect, false); } else { document.write('您的瀏覽器不支持File Api'); }

由以上代碼可以看到,html5為file這個(gè)dom元素新增了files接口(e.target指向了file input元素,實(shí)際上也可以用this來訪問,即this.files),得到的就是FileList,通過遍歷該集合,即可訪問到各個(gè)已選擇的文件對(duì)象。

2.2 通過拖拽讀取圖片文件

前面我們看到,FileReader處理文本內(nèi)容只需要一步,同樣,處理圖片內(nèi)容也這么簡(jiǎn)單,而這就要?dú)w功于readAsDataURL()方法。
下面的例子中,讓用戶把圖片拖到頁面中,然后在圖片上繪制。

下面是HTML和css代碼

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>拖拽圖片</title><style>#dropBox {margin: 15px;width: 300px;height: 300px;border:5px dashed grey;border-radius: 8px;background: lightyellow;background-size: 100%;background-repeat: no-repeat;text-align: center;}#dropBox div{margin: 100px 70px;color: orange;font-size: 25px;}</style> </head><body><div id="dropBox"><div>將你的圖片拖到此處</div></div> </body> </html>

為處理放置文件的操作,需要處理三個(gè)事件:onDragEnter、onDragOver、onDrop。頁面一加載完成,就會(huì)為這三個(gè)事件添加處理程序。

var dropBox; window.onload = function() {dropBox = document.getElementById("dropBox");dropBox.ondragenter = ignoreDrag;dropBox.ondragover = ignoreDrag;dropBox.ondrop = drop; }

其中,ignoreDrag()函數(shù)同時(shí)處理onDragEnter和onDragOver事件,前者在鼠標(biāo)指針進(jìn)入放置區(qū)時(shí)發(fā)生,后者在拖動(dòng)文件的鼠標(biāo)指針位于放置區(qū)之上時(shí)發(fā)生。之所以用同一個(gè)函數(shù)處理兩個(gè)事件,原因就是不必對(duì)這兩個(gè)事件作出反應(yīng),只要告訴瀏覽器自己什么也不做即可。

function ignoreDrag(e) { //因?yàn)槲覀冊(cè)谔幚硗戏?#xff0c;所以應(yīng)該確保沒有其他元素會(huì)取得這個(gè)事件e.stopPropagation();e.preventDefault(); }

我們要響應(yīng)的事件是onDrop,這個(gè)事件一發(fā)生就說明要取得和處理文件了。

function drop(e) {//取消事件傳播及默認(rèn)行為e.stopPropagation();e.preventDefault();//取得拖進(jìn)來的文件var data = e.dataTransfer;var files = data.files;//將其傳給真正的處理文件的函數(shù)processFiles(files); }function processFiles(files) {var file = files[0];//創(chuàng)建FileReadervar reader = new FileReader();//告訴它準(zhǔn)備好數(shù)據(jù)URL之后做什么reader.onload = function(e) {dropBox.style.backgroundImage = "url('" + e.target.result + "')";};//讀取圖片:將圖片轉(zhuǎn)化為數(shù)據(jù)URLreader.readAsDataURL(file); }

效果圖:
拖拽前:

拖拽后:

2.3 瀏覽器對(duì)File API的支持情況

更多內(nèi)容請(qǐng)參考此處

總結(jié)

以上是生活随笔為你收集整理的学习File API用于前端读取文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。