由淺入深了解文件操作

1、讀取計(jì)算機(jī)中的文件

直接 file 類型獲取

 <input type="file">

效果:
文件上傳.png

2、獲取讀取文件的基本信息

html5在DOM的文件輸入元素中添加了 files集合,一個(gè) file對(duì)應(yīng)一個(gè)文件。每個(gè)File對(duì)象都有下列只讀屬性:

  • name: 本地文件系統(tǒng)中的文件名
  • size: 文件的字節(jié)大小
  • type: 文件的MIME類型
  • lastModifedDate: 字符串,上次被修改的時(shí)間 ( 兼容性不強(qiáng))
    ??:
<input type="file" id='file'>
<script>
  const  file = document.getElementById('file')
  file.addEventListener('change', function(e) {
    console.log(e.target.files)
  },false)
</script>

效果:
獲取文件的信息.png

3、讀取文件:FileReader類型

FileReader類型實(shí)現(xiàn)的是一種異步文件讀取機(jī)制。類似于XMLHttpRequest, 區(qū)別是讀取的是文件系統(tǒng), 而不是遠(yuǎn)程服務(wù)器。FileReader類型有4個(gè)API:

  • readAsText(file, encoding) : 純文本形式讀取
  • readAsDataURL(file) : 讀取文件并將文件以數(shù)據(jù)URI 的形式保存
  • readAsBinaryString(file): 讀取文件并將一個(gè)字符串進(jìn)行保存, 字符串中的每個(gè)字符表示一字節(jié)
  • readAsArrayBuffer(file): 讀取文件并將一個(gè)包含文件內(nèi)容的ArrayBuffer保存

FileReader類型有3個(gè)事件:

  • progress: 每50ms觸發(fā)一次progress
  • error: code碼- 1:未找到文件;2:安全性錯(cuò)誤;3:讀取中斷;4:文件不可讀;5:編碼錯(cuò)誤
  • load: 成功加載觸發(fā)load;觸發(fā)error, 不會(huì)發(fā)生load事件;

FileReader類型有2個(gè)屬性:

  • error
  • result

FileReader 可以從Blob類型數(shù)據(jù)中讀取數(shù)據(jù):

const  reader = new FileReader()
reader.readAsText(blob)

??:

<input type="file" id='file'>
<div id="progress"></div>
<div id="result"></div>

<script>
  const file = document.getElementById('file')
  file.addEventListener('change', function(e) {
    const reader = new FileReader()
    const files = e.target.files
    let type = 'default'

    let result = document.getElementById('result')
    let progress = document.getElementById('progress')

    if (/image/.test(files[0].type)) {
       reader.readAsDataURL(files[0])
       type = 'image'
    } else {
       reader.readAsText(files[0])
       type = 'text'
    }

    reader.onload = function() {
      let html = ''
      switch(type) {
        case 'image': 
          html = `<img src='${reader.result}' alt='ss'/>`
          break;
        case 'text':
          html = reader.result;
          break;
      } 
      result.innerHTML =  html
    }
    reader.onerror = function() {
       result.innerHTML = reader.error.code
    }
    
    reader.onprogress = function(event) {
      console.log(e)
       if(event.lengthComputable) {
        progress = `${event.loaded} / ${event.total}`
       }
    }
  },false)

4、讀取部分內(nèi)容

只讀取部分內(nèi)容, 不讀取全部?jī)?nèi)容,比如只讀取 文件頭部信息。 此時(shí)需使用 slice 方法。入?yún)槠鹗甲止?jié) 和要讀取的字節(jié)數(shù), 返回Blob實(shí)例。

<input type="file" id='file'>
<div id="result"></div>
<script>
  const file = document.getElementById('file')

  file.addEventListener('change', function(e) {
    const reader = new FileReader()
    const files = e.target.files
    const result = document.getElementById('result')
    const blob = files[0].slice(0,32)

    if(blob){
      reader.readAsText(blob)
      reader.onload = function() {
        result.innerHTML = reader.result
      }
    }
  },false)
</script>

結(jié)果:
image.png

5、對(duì)象URL

對(duì)象URL 也稱為blob URL,指的是 引用保存在File 或Blob中數(shù)據(jù)的URL。
好處: 不必把文件內(nèi)容讀取到JavaScript中而直接使用文件內(nèi)容;
使用方式: 在需要使用文件內(nèi)容的地方 使用對(duì)象URL
創(chuàng)建: window.URL.createObjectURL(), 入?yún)閎lob or file 對(duì)象 ; 返回值為字符串即一塊內(nèi)存的地址

<input type="file" id='file'>
<div id="result"></div>

<script>
  const file = document.getElementById('file')

  file.addEventListener('change', function(e) {
    const reader = new FileReader()
    const files = e.target.files
    const result = document.getElementById('result')
    const url = window.URL.createObjectURL(files[0])

    if(url) {
        if (/image/.test(files[0].type)) {
          result.innerHTML = `<img src='${url}' />`
        }  
    }
  },false)
</script>

結(jié)果:
image.png

6、總結(jié)

我將上面的內(nèi)容總結(jié)成思維導(dǎo)圖了, 記得更清楚哈~~

File.png

hi~~~ 今天開心了沒~~

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

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

  • 前言 在 HTML5 File API 出現(xiàn)之前,前端對(duì)于文件的操作是非常有局限性的,大多需要配合后端實(shí)現(xiàn)。出于安...
    D_R_M閱讀 2,356評(píng)論 0 2
  • 前端無(wú)法像原生APP一樣直接操作本地文件,否則的話打開個(gè)網(wǎng)頁(yè)就能把用戶電腦上的文件偷光了,所以需要通過(guò)用戶觸發(fā),用...
    雷波_viho閱讀 879評(píng)論 0 1
  • 最近接手了一個(gè)項(xiàng)目,接觸到一些對(duì)文件操作的業(yè)務(wù).所以在這邊整理一下日常用到的處理方式,當(dāng)學(xué)習(xí)筆記吧,有不對(duì)的地方,...
    noahlam閱讀 1,104評(píng)論 0 0
  • 上傳方式 一、Form && Input 采用傳統(tǒng)的form表單或異步ajax上傳。至于以前通過(guò)iframe來(lái)進(jìn)行...
    有一條大魚閱讀 989評(píng)論 0 1
  • 前端無(wú)法像原生APP一樣直接操作本地文件,否則的話打開個(gè)網(wǎng)頁(yè)就能把用戶電腦上的文件偷光了,所以需要通過(guò)用戶觸發(fā),用...
    AlphaEarth閱讀 517評(píng)論 0 0

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