成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

前端培訓(xùn)-初級(jí)階段-場(chǎng)景實(shí)戰(zhàn)(2019-06-06)-下載文件&下載進(jìn)度

freecode / 3248人閱讀

摘要:前端最基礎(chǔ)的就是。一個(gè)朋友的問(wèn)題,監(jiān)測(cè)下載進(jìn)度。這節(jié)主要是講如何使用,以及前端下載的核心操作。下載文件,并顯示進(jìn)度條。下載文件,并顯示進(jìn)度條下載文件上面已經(jīng)實(shí)現(xiàn)了,那我們先說(shuō)說(shuō)如何顯示進(jìn)度條。實(shí)現(xiàn)代碼如下,我們操作成讀流,然后統(tǒng)計(jì)長(zhǎng)度。

前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門(mén)技術(shù)就算入門(mén),但也僅僅是入門(mén),現(xiàn)在前端開(kāi)發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水平,打牢基礎(chǔ)知識(shí)的中心思想,我們開(kāi)課啦(每周四)。

這兩天,碰到了不止一次前端下載的的問(wèn)題。其實(shí)之前我寫(xiě)過(guò)一篇文章 download使用淺析,主要依靠 download 屬性來(lái)實(shí)現(xiàn)瀏覽器端下載,因?yàn)槭亲邽g覽器的下載,所以沒(méi)有進(jìn)度條。今天我們就來(lái)說(shuō)說(shuō)我的解決方案。

sf 的一個(gè)問(wèn)題,需要顯示進(jìn)度條。答案地址,問(wèn)題地址

一個(gè)朋友的問(wèn)題,下載的文件需要 headers 驗(yàn)證,無(wú)奈只能 ajax 拿數(shù)據(jù),但是拉回來(lái)的還是字符串,需要自己處理。

一個(gè)朋友的問(wèn)題,監(jiān)測(cè)下載進(jìn)度。

今天我們要講什么?

如何使用 download 屬性,下載文件。
這節(jié)主要是講如何使用,以及前端下載的核心操作。

下載文件,并顯示進(jìn)度條。
這節(jié)是正常操作,如果你只為了解原理,看到這里就夠了

其他數(shù)據(jù)類(lèi)型如何互相轉(zhuǎn)換
這節(jié)就不一樣了。因?yàn)橹暗?api 是使用 blob 實(shí)現(xiàn),但是 ajax 傳回來(lái)的數(shù)據(jù)有好多種類(lèi)型,我們?nèi)绾螌⑺麄兿嗷マD(zhuǎn)換?

如何使用 download 屬性,下載文件。

download使用淺析 這一文中已經(jīng)介紹了,可以去看看。我這里簡(jiǎn)單說(shuō)一下。標(biāo)簽如果設(shè)置了 download 屬性,他就會(huì)去下載這個(gè)地址。測(cè)試地址-原生 download 屬性測(cè)試。

下載文件,并顯示進(jìn)度條

下載文件上面已經(jīng)實(shí)現(xiàn)了,那我們先說(shuō)說(shuō)如何顯示進(jìn)度條。

顯示進(jìn)度條

其實(shí)瀏覽器也是有進(jìn)度條的,但是咱們拿不到。那我們就來(lái)模擬一下載,然后顯示進(jìn)度條。

ajax 實(shí)現(xiàn)下載進(jìn)度條,測(cè)試地址-顯示進(jìn)度條

xhr = new XMLHttpRequest();
xhr.open("get", file1.url);
xhr.onprogress = (e)=>console.log(e)//e 就是一個(gè) ProgressEvent 對(duì)象,其中 loaded 是已下載的, total 是總大小。
xhr.send()

fetch 實(shí)現(xiàn)下載進(jìn)度條,測(cè)試地址-fetch顯示進(jìn)度條并下載
fetch 的實(shí)現(xiàn)上來(lái)說(shuō)有一些功能是沒(méi)有的,比如 abort、進(jìn)度等。那我們就需要去通過(guò)一些別的手段來(lái)模擬實(shí)現(xiàn)。
實(shí)現(xiàn)代碼如下,我們操作成讀流,然后統(tǒng)計(jì)長(zhǎng)度。

下載文件

進(jìn)度條已經(jīng)顯示好了,那我們可以下載文件了。首先我們要分幾種情況

緩存下載(一個(gè)資源如果已經(jīng)下載完了,再次去訪問(wèn))

本地下載(資源已經(jīng)在瀏覽器中)

blob url 下載 如這種地址 blob:https://www.lilnong.top/deb4c297-821c-4545-9b23-0fbdd76890c7

base64 url 下載 如這種地址 data:application/octet-stream;base64,aGVsbG8gbGlub25n

  blob = new Blob(["hello linong"])
  freader = new FileReader()
  freader.readAsDataURL(blob)//將 blob 讀成 dataurl
  freader.onload=e=>console.log(freader.result)// 異步的,所以需要回調(diào)里面拿

無(wú)緩存下載(資源沒(méi)在本地,也沒(méi)有緩存)

情況就是上面幾種,那我們要做的其實(shí)就是統(tǒng)一一下流程

ajax 拉取數(shù)據(jù)(顯示進(jìn)度條)

緩存了數(shù)據(jù),然后下載緩存(因?yàn)槭蔷彺?,所以秒下?/p>

瀏覽器緩存
我比較推薦用這個(gè),因?yàn)槠渌姆桨付加?strong>大小或者兼容上的問(wèn)題。但是這個(gè)緩存需要服務(wù)器設(shè)置需要走緩存。

bloburl 本地緩存下載
這個(gè)方案在移動(dòng)端異常,pc端正常,感興趣的小伙伴可以自己實(shí)現(xiàn)一下,畢竟學(xué)了這么多,得用起來(lái)才能變成自己的

dataurl 本地緩存下載
這個(gè)方案的支持會(huì)比 bloburl 好一點(diǎn),但是只適用于小文件。

實(shí)現(xiàn)前端下載文件并顯示進(jìn)度條

我們讓 ajax 直接返回 blob。然后構(gòu)建 bloburl 用于下載。

downloadFile2 = (url)=>{
    var xhr = new XMLHttpRequest();
    xhr.open("get", url);
    xhr.responseType="blob";//這是精髓
    xhr.onprogress = onprogress2;//下載進(jìn)度
    // .upload.onprogress 這個(gè)是上傳的時(shí)候的進(jìn)度
    xhr.onreadystatechange = ()=>{
        if(xhr.readyState == 4 && xhr.status == 200){
            nativeDownload(URL.createObjectURL(xhr.response))
        }
    }
    xhr.send()
}
其他類(lèi)型轉(zhuǎn)換為 blob

如果是一些封裝過(guò)的 ajax,沒(méi)辦法使用 xhr.responseType="blob" 之類(lèi)的,返回回來(lái)是字符串。那我們需要怎么出轉(zhuǎn)換呢?

blob to *

blob 需要配合 FileReader 來(lái)讀取

blob to arrayBufferreadAsArrayBuffer
通用的、固定長(zhǎng)度的原始二進(jìn)制數(shù)據(jù)緩沖區(qū)

var fileReader = new FileReader();
fileReader.readAsArrayBuffer(xhr.response);//xhr.reponse 是 blob 類(lèi)型
fileReader.onload = e=>console.log(fileReader.result);

blob to DataURLreadAsDataURL

Base64 是一組相似的二進(jìn)制到文本(binary-to-text)的編碼規(guī)則,使得二進(jìn)制數(shù)據(jù)在解釋成 radix-64 的表現(xiàn)形式后能夠用 ASCII 字符串的格式表示出來(lái)。Base64 這個(gè)詞出自一種 MIME 數(shù)據(jù)傳輸編碼。 --MDN

blob to TextreadAsText
以字符串表示所讀取的文件內(nèi)容

blob to BinaryStringreadAsBinaryString
文件的原始二進(jìn)制數(shù)據(jù)

* to blob

arrayBuffer to blob
new Blob([arrayBuffer], {type: "image/jpeg"})

base64 to blob

(new Uint8Array(Array.from(atob(base64url.split(",")[1])).map(v=>v.charCodeAt()))).buffer
//base64url.split(",")[1] //截取不要 data:images/jpeg;base64, 這串
//atob //轉(zhuǎn)換成 BinaryString
//Array.from //轉(zhuǎn)換成數(shù)組
//map(v=>v.charCodeAt()) //轉(zhuǎn)換成對(duì)應(yīng)的 ascii 碼
//Uint8Array 轉(zhuǎn)換成 Uint8Array 然后輸出 buffer

BinaryString to blob
方案同上,因?yàn)樯厦娴囊彩寝D(zhuǎn)換成了BinaryString

Text to blob
ajax 默認(rèn)就是 Text 類(lèi)型的返回值。這個(gè)我覺(jué)得是編碼類(lèi)型的轉(zhuǎn)換,比如 utf-8 to ascii,目前我還沒(méi)找到好的實(shí)現(xiàn)方法。

總結(jié)

之前就寫(xiě)過(guò)一篇AJAX 的進(jìn)階使用(Blob、ArrayBuffer、FormData、Document、JSON、Text),里面講了這些支持的類(lèi)型。
base64轉(zhuǎn)換上傳,也寫(xiě)過(guò)這樣的。

前端目前需要操作的東西越來(lái)越多了。

在最上面那個(gè)問(wèn)答里,有個(gè)庫(kù)去實(shí)現(xiàn) download 操作。實(shí)現(xiàn)原理可以自己去看看。

后記 參考資料

Data URLs --MDN

StringView

字符編碼中ASCII、Unicode和UTF-8的區(qū)別

String?.prototype?.char?CodeAt()

DOMString

rfc2397

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

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

相關(guān)文章

  • 前端培訓(xùn)-初級(jí)階段-場(chǎng)景實(shí)戰(zhàn)2019-06-06)-下載文件&下載進(jìn)度

    摘要:前端最基礎(chǔ)的就是。一個(gè)朋友的問(wèn)題,監(jiān)測(cè)下載進(jìn)度。這節(jié)主要是講如何使用,以及前端下載的核心操作。下載文件,并顯示進(jìn)度條。下載文件,并顯示進(jìn)度條下載文件上面已經(jīng)實(shí)現(xiàn)了,那我們先說(shuō)說(shuō)如何顯示進(jìn)度條。實(shí)現(xiàn)代碼如下,我們操作成讀流,然后統(tǒng)計(jì)長(zhǎng)度。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門(mén)技術(shù)就算入門(mén),但也僅僅是入門(mén),現(xiàn)在前端開(kāi)發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(H...

    sPeng 評(píng)論0 收藏0
  • 前端培訓(xùn)-初級(jí)階段-場(chǎng)景實(shí)戰(zhàn)2019-06-06)-Content-Type對(duì)照表及日常使用

    摘要:前端最基礎(chǔ)的就是。數(shù)據(jù)被編碼為鍵值對(duì)。大法好,精準(zhǔn)識(shí)別,也算是正確的表單提交。全局的默認(rèn)值實(shí)例默認(rèn)值創(chuàng)建實(shí)例時(shí)設(shè)置配置的默認(rèn)值在實(shí)例已創(chuàng)建后修改默認(rèn)值攔截器,可以攔截錯(cuò)誤,進(jìn)行上報(bào)。參考資料類(lèi)型看云 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門(mén)技術(shù)就算入門(mén),但也僅僅是入門(mén),現(xiàn)在前端開(kāi)發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水...

    mayaohua 評(píng)論0 收藏0
  • 前端培訓(xùn)-初級(jí)階段-場(chǎng)景實(shí)戰(zhàn)2019-06-06)-Content-Type對(duì)照表及日常使用

    摘要:前端最基礎(chǔ)的就是。數(shù)據(jù)被編碼為鍵值對(duì)。大法好,精準(zhǔn)識(shí)別,也算是正確的表單提交。全局的默認(rèn)值實(shí)例默認(rèn)值創(chuàng)建實(shí)例時(shí)設(shè)置配置的默認(rèn)值在實(shí)例已創(chuàng)建后修改默認(rèn)值攔截器,可以攔截錯(cuò)誤,進(jìn)行上報(bào)。參考資料類(lèi)型看云 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門(mén)技術(shù)就算入門(mén),但也僅僅是入門(mén),現(xiàn)在前端開(kāi)發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水...

    張金寶 評(píng)論0 收藏0

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

0條評(píng)論

閱讀需要支付1元查看
<