国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

關(guān)于前端實(shí)現(xiàn)文件下載功能

Arno / 2779人閱讀

摘要:問題以上兩種方式,當(dāng)在下載格式,或者視頻文件時(shí),瀏覽器會(huì)直接播放該文件,而達(dá)不到直接下載的功能,此時(shí),當(dāng)下載音視頻文件時(shí)無法使用以上兩種方式。

1、通過window.open()打開新頁面下載文件
window.open(`url`, "_self")

使用場(chǎng)景:下載excel文件,后端提供接口,接口返回的是文件流,可以直接使用window.open(),最簡單的方式。

優(yōu)點(diǎn):最簡潔;

弊端:當(dāng)參數(shù)錯(cuò)誤時(shí),或其它原因?qū)е陆涌谡?qǐng)求失敗,這時(shí)無法監(jiān)聽到接口返回的錯(cuò)誤信息,需要保證請(qǐng)求必須是正確的且能正確返回?cái)?shù)據(jù)流,不然打開頁面會(huì)直接輸出接口返回的錯(cuò)誤信息,體驗(yàn)不好。

2、通過a標(biāo)簽打開新頁面下載文件
export const exportFile = (url, fileName) => {
  const link = document.createElement("a")
  const body = document.querySelector("body")

  link.href = url
  link.download = fileName

  // fix Firefox
  link.style.display = "none"
  body.appendChild(link)

  link.click()
  body.removeChild(link)
}

通過a標(biāo)簽下載的方式,同window.open()是一樣的,唯一的優(yōu)點(diǎn)是可以自定義下載后的文件名,a標(biāo)簽里有download屬性可以自定義文件名。

弊端:同window.open()方式一樣,無法監(jiān)聽錯(cuò)誤信息。

問題:以上兩種方式,當(dāng)在下載.mp3格式,或者視頻文件時(shí),瀏覽器會(huì)直接播放該文件,而達(dá)不到直接下載的功能,此時(shí),當(dāng)下載音視頻文件時(shí)無法使用以上兩種方式。

3、通過文件流的方式下載

為了解決.mp3文件下載所帶來的問題,通過ajax請(qǐng)求返回Blob對(duì)象,或者ArrayBuffer對(duì)象。

(1)、獲取文件

如下:通過原生ajax請(qǐng)求返回Blob對(duì)象

const getBlob = (url) => {
  return new Promise((resolve) => {
    const xhr = new XMLHttpRequest()

    xhr.open("GET", url, true)
    xhr.responseType = "blob"
    xhr.onload = () => {
      if (xhr.status === 200) {
        resolve(xhr.response)
      }
    }

    xhr.send()
  })
}

同樣,也可以通過axios返回ArrayBuffer對(duì)象,同等作用

import axios from "axios"
const getFile = url => {
    return new Promise((resolve, reject) => {
        axios({
            method:"get",
            url,
            responseType: "arraybuffer"
        }).then(data => {
            resolve(data.data)
        }).catch(error => {
            reject(error.toString())
        })
    })
}

ArrayBuffer(又稱類型化數(shù)組)

ArrayBuffer對(duì)象用來表示通用的、固定長度的原始二進(jìn)制數(shù)據(jù)緩沖區(qū)。ArrayBuffer 不能直接操作,而是要通過類型數(shù)組對(duì)象或 DataView 對(duì)象來操作,它們會(huì)將緩沖區(qū)中的數(shù)據(jù)表示為特定的格式,并通過這些格式來讀寫緩沖區(qū)的內(nèi)容。

Blob(Binary Large Object): 二進(jìn)制大數(shù)據(jù)對(duì)象

Blob 對(duì)象表示一個(gè)不可變、原始數(shù)據(jù)的類文件對(duì)象。Blob 表示的不一定是JavaScript原生格式的數(shù)據(jù)。File 接口基于Blob,繼承了 blob 的功能并將其擴(kuò)展使其支持用戶系統(tǒng)上的文件。

注意:

如果下載文件是文本類型的(如: .txt, .js之類的), 那么用responseType: "text"也可以, 但是如果下載的文件是圖片, 視頻之類的, 就得用arraybuffer或blob,更多詳情請(qǐng)查看MDN

通過ajax請(qǐng)求的方式下載文件,可以解決第1、2中存在的弊端,當(dāng)請(qǐng)求錯(cuò)誤時(shí)或捕獲到錯(cuò)誤信息

(2)、保存文件

當(dāng)獲取到文件后,這時(shí)需要保存文件

const saveAs = (blob, filename) => {
  if (window.navigator.msSaveOrOpenBlob) {
    navigator.msSaveBlob(blob, filename)
  } else {
    const link = document.createElement("a")
    const body = document.querySelector("body")

    link.href = window.URL.createObjectURL(blob) // 創(chuàng)建對(duì)象url
    link.download = filename

    // fix Firefox
    link.style.display = "none"
    body.appendChild(link)

    link.click()
    body.removeChild(link)

    window.URL.revokeObjectURL(link.href) // 通過調(diào)用 URL.createObjectURL() 創(chuàng)建的 URL 對(duì)象
  }
}
為了解決IE(ie10 - 11)和Edge無法打開Blob URL鏈接的方法,微軟自己有一套方法window.navigator.msSaveOrOpenBlob(blob, filename),打開并保存文件,以上代碼做了簡單的兼容,navigator.msSaveBlob(blob, filename)是直接保存。注意,此為非標(biāo)準(zhǔn)功能,詳情請(qǐng)查看相關(guān)文檔。

以下為完整代碼

const getBlob = (url) => {
  return new Promise((resolve) => {
    const xhr = new XMLHttpRequest()

    xhr.open("GET", url, true)
    xhr.responseType = "blob"
    xhr.onload = () => {
      if (xhr.status === 200) {
        resolve(xhr.response)
      }
    }

    xhr.send()
  })
}

const saveAs = (blob, filename) => {
  if (window.navigator.msSaveOrOpenBlob) {
    navigator.msSaveBlob(blob, filename)
  } else {
    const link = document.createElement("a")
    const body = document.querySelector("body")

    link.href = window.URL.createObjectURL(blob) // 創(chuàng)建對(duì)象url
    link.download = filename

    // fix Firefox
    link.style.display = "none"
    body.appendChild(link)

    link.click()
    body.removeChild(link)

    window.URL.revokeObjectURL(link.href) // 通過調(diào)用 URL.createObjectURL() 創(chuàng)建的 URL 對(duì)象
  }
}

export const download = (url, filename = "") => {
  getBlob(url).then((blob) => {
    saveAs(blob, filename)
  })
}
4、如何實(shí)現(xiàn)批量下載,且打包文件

在第3點(diǎn)的基礎(chǔ)上,如果要實(shí)現(xiàn)批量下載,那能做到的只是連續(xù)多次調(diào)用download方法,這樣無法批量集中的下載文件。這個(gè)時(shí)候就需要能夠?qū)σ勋@取到的文件流,進(jìn)行一個(gè)打包的操作,然后一次下載完畢。

這時(shí),需要用到兩個(gè)庫jszipfile-saver

完整的思路,通過ajax獲取文件,然后用 jszip 壓縮文件, 再用 file-saver 生成文件

(1)、獲取文件

同第3點(diǎn)中的第(1)點(diǎn)

(2)、打包文件
export const download = () => {
  const urls = ["url", "url"]   //需要下載的路徑
  const zip = new JSZip()
  const cache = {}
  const promises = []
  urls.forEach((item) => {
    const promise = getBlob(item).then((data) => { // 下載文件, 并存成ArrayBuffer對(duì)象
      zip.file("下載文件名", data, { binary: true }) // 逐個(gè)添加文件
      cache[item.fileName] = data
    })
    promises.push(promise)
  })

  Promise.all(promises).then(() => {
    zip.generateAsync({ type: "blob" }).then((content) => { // 生成二進(jìn)制流
      FileSaver.saveAs(content, `打包下載.zip`) // 利用file-saver保存文件
    })
  })
}

相關(guān)jszip/file-saver更多詳情

jszip:

https://github.com/Stuk/jszip

http://stuk.github.io/jszip/d...

file-saver:

https://github.com/eligrey/Fi...

貼上完整代碼

/**
 * 獲取文件
 * @param url
 * @returns {Promise}
 */
const getBlob = (url) => {
  return new Promise((resolve) => {
    const xhr = new XMLHttpRequest()

    xhr.open("GET", url, true)
    xhr.responseType = "blob"
    xhr.onload = () => {
      if (xhr.status === 200) {
        resolve(xhr.response)
      }
    }

    xhr.send()
  })
}

/**
 * 批量打包zip包下載
 * @param urlArr Array [{url: 下載文件的路徑, fileName: 下載文件名稱}]
 * @param filename zip文件名
 */
export const download = (urlArr, filename = "打包下載") => {
  if (!urlArr.length > 0) return
  const zip = new JSZip()
  const cache = {}
  const promises = []
  urlArr.forEach((item) => {
    const promise = getBlob(item.url).then((data) => { // 下載文件, 并存成ArrayBuffer對(duì)象
      zip.file(item.fileName, data, { binary: true }) // 逐個(gè)添加文件
      cache[item.fileName] = data
    })
    promises.push(promise)
  })

  Promise.all(promises).then(() => {
    zip.generateAsync({ type: "blob" }).then((content) => { // 生成二進(jìn)制流
      FileSaver.saveAs(content, `${filename}.zip`) // 利用file-saver保存文件
    })
  })
}

注意:

由于通過瀏覽器進(jìn)行打包壓縮,如果文件過大,或者下載的內(nèi)容過多,可能導(dǎo)致瀏覽器崩潰。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/104340.html

相關(guān)文章

  • 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(四) ----- FileReader

    摘要:沒有瀏覽器測(cè)試,所以不知道是不是有效,其實(shí)里面看起來比我寫的那個(gè)復(fù)雜,實(shí)際上多了個(gè)檢驗(yàn)格式上兼容寫法所以不要怕,如果我錯(cuò)了記得提醒下我啊。目前為止其實(shí)已經(jīng)該說的都差不多覆蓋到了吧,動(dòng)手能力強(qiáng)的話已經(jīng)可以根據(jù)教程寫一個(gè)實(shí)例出來的了。 系列文章 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(...

    Tony 評(píng)論0 收藏0
  • 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(二) ----- File

    摘要:為了解救上面說到的問題是向提交的一個(gè)草案,旨在推出一套標(biāo)準(zhǔn)的,其基本功能是實(shí)現(xiàn)用對(duì)本地文件進(jìn)行操作。出于安全性的考慮,該只對(duì)本地文件提供有限的訪問。 系列文章 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(二) ----- File關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(三) ----- For...

    scola666 評(píng)論0 收藏0
  • 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(六) ----- 圖片上傳,旋轉(zhuǎn),重繪,預(yù)覽等實(shí)戰(zhàn)(附DEMO)

    摘要:二編輯合成照片使用編輯壓縮重設(shè)尺寸比例轉(zhuǎn)成輸出預(yù)覽。三保存并上傳照片提交數(shù)據(jù)到服務(wù)器需要服務(wù)器支持我跳過了。數(shù)據(jù)主要來自拍攝的照片,多用于移動(dòng)端開發(fā),端也會(huì)用到,此插件兼容主流瀏覽器,以下不支持。 系列文章 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(二) ----- File關(guān)于前端...

    lmxdawn 評(píng)論0 收藏0
  • 前端基礎(chǔ)

    摘要:談起閉包,它可是兩個(gè)核心技術(shù)之一異步基于打造前端持續(xù)集成開發(fā)環(huán)境本文將以一個(gè)標(biāo)準(zhǔn)的項(xiàng)目為例,完全拋棄傳統(tǒng)的前端項(xiàng)目開發(fā)部署方式,基于容器技術(shù)打造一個(gè)精簡的前端持續(xù)集成的開發(fā)環(huán)境。 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果讀完本文還不懂,可以揍我。 不論你是javascript新手還是老鳥,不論是面試求職,還是日...

    graf 評(píng)論0 收藏0
  • 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest

    摘要:狀態(tài)表示對(duì)象的狀態(tài)狀態(tài)描述未初始化。表示成功,表示未找到,表示服務(wù)器內(nèi)部錯(cuò)誤等。前提是瀏覽器必須支持這個(gè)功能,而且服務(wù)器端必須同意這種跨域。事件傳輸成功完成。 系列文章 關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(零)關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(一) ----- XMLHttpRequest關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(二) ----- File關(guān)于前端上傳文件全面基礎(chǔ)掃盲貼(三) ----...

    i_garfileo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<