国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

StreamSaver.js入門教程:優(yōu)雅解決前端下載文件的難題

這篇具有很好參考價值的文章主要介紹了StreamSaver.js入門教程:優(yōu)雅解決前端下載文件的難題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文簡介

點贊 + 關注 + 收藏 = 學會了


本文介紹一個能讓前端優(yōu)雅下載大文件的工具:StreamSaver.js

  • ?? StreamSaver.js GitHub地址
  • ?? 官方案例

StreamSaver.js 可用于實現(xiàn)在Web瀏覽器中直接將大文件流式傳輸?shù)接脩粼O備的功能。

傳統(tǒng)的下載方式可能導致大文件的加載時間較長或造成內存占用過大的問題,使用 <a> 標簽打開新頁面下載文件,遇到 .txt 或者 .mp4 之類的文件可能就直接在頁面展示了,不會觸發(fā)下載功能。而 StreamSaver.js 則通過流式下載的方式解決了這些問題。

StreamSaver.js 將大文件拆分成小塊,并在下載過程中逐塊傳輸?shù)接脖P,從而降低內存占用和提高下載速度。



環(huán)境準備

要學習 StreamSaver.js 首先要準備一份或者多份可下載的文件。

你可以使用網(wǎng)絡上的文件資源,但這需要你自己去找。

你也可以在自己的電腦運行個服務,把文件資源丟進去即可。


如果你用腳手架創(chuàng)建項目,比如vue或者react之類的項目,也可以把文件放在靜態(tài)資源目錄里。

比如用 vite 創(chuàng)建一個 Vue 項目,然后在 public 目錄下創(chuàng)建一個 test.txt 文件。項目運行起來,在瀏覽器訪問 http://localhost:端口號/public/test.txt 就能查看到這個文件內容。



安裝 StreamSaver.js

可以使用 CDN 或者 npm 安裝 StreamSaver.js

本文使用 CDN 的方式講解。


CDN

打開 StreamSaver.js的倉庫。

StreamSaver.js入門教程:優(yōu)雅解決前端下載文件的難題,前端

StreamSaver.js 文件下載到你項目里引入即可。

<script src="../StreamSaver.js"></script>

npm

??StreamSaver npm地址


使用以下命令下載 StreamSaver 到項目里

npm i streamsaver

然后在要使用的地方引入即可。

import streamSaver from "streamsaver"


起步

起步階段,我們先試試如何下載一個 .txt 文件。

如果我們要下載一些瀏覽器讀不懂的文件,我們可以使用 <a>標簽在新窗口打開鏈接,也可以使用 windows.open('url') 的方式打開新窗口進行下載。

但如果這個文件瀏覽器是讀得懂的,比如 .txt 文件,那瀏覽器就不會執(zhí)行下載,而是會直接在頁面中把文件內容展示出來。

此時就可以使用 StreamSaver.js 來解決這個問題。

使用 StreamSaver.js 下載文件的大概流程是這樣的(為了方便理解,我用一些不專業(yè)的術語進行描述):

  1. 創(chuàng)建一個文件,該文件支持寫入操作。streamSaver.createWriteStream('文件名.后綴')
  2. 使用 fetch 方法訪問文件的url,將內容一點點的放到 StreamSaver 創(chuàng)建的文件里。
  3. 監(jiān)聽文件內容是否讀取完整,讀取完就執(zhí)行“保存并關閉文件”的操作。

根據(jù)上面的指引編寫代碼:

<!-- 下載按鈕 -->
<button id="download">下載</button>

<!-- 引入StreamSaver.js -->
<script src="../StreamSaver.js"></script>
<script>
  // 監(jiān)聽按鈕點擊事件,點擊就下載文件
  download.onclick = () => {
    // 【步驟1】創(chuàng)建一個文件,該文件支持寫入操作
    const fileStream = streamSaver.createWriteStream('test.txt') // 這里傳入的是下載后的文件名,這個名字可以自定義

    // 【步驟2】使用 fetch 方法訪問文件的url,將內容一點點的放到 StreamSaver 創(chuàng)建的文件里
    fetch('http://localhost:9988/public/test.txt')
      .then(res => {
        const readableStream = res.body
        if (window.WritableStream && readableStream.pipeTo) {
          return readableStream.pipeTo(fileStream)
            .then(() => console.log('完成寫入'))
        }

        // 【步驟3】監(jiān)聽文件內容是否讀取完整,讀取完就執(zhí)行“保存并關閉文件”的操作。
        window.writer = fileStream.getWriter()
        const reader = res.body.getReader()
        const pump = () => reader.read()
          .then(res => res.done
            ? writer.close()
            : writer.write(res.value).then(pump)
          )
        pump()
      })
  }
</script>

大概就是這樣子了。


??提示

如果遇到提示跨域的問題,可以配置 mitm 指向 mitm.html

mitm.htmlStreamSaver.js倉庫 里可以獲取到。

StreamSaver.js入門教程:優(yōu)雅解決前端下載文件的難題,前端

可以把 mitm.html 放到你服務器再配置。

streamSaver.mitm = 'https://你的服務器地址/mitm.html'


打包下載 zip

如果想將多個文件打包成zip下載到本地,可以將 StreamSaver.jszip-stream.js 結合在一起使用。

zip-stream.jsStreamSaver.js 的倉庫里有。

StreamSaver.js入門教程:優(yōu)雅解決前端下載文件的難題,前端

zip-stream.js/examples 目錄里。


使用 npm 安裝 streamsaver 也能在 /examples 目錄下找到 zip-stream.js,直接引入即可。

import 'node_modules/streamsaver/examples/zip-stream.js'

如果使用 CDN 的方式就直接用 <script src='zip-stream.js'></script> 引入即可。


打包zip下載的步驟:

  1. 創(chuàng)建下載后的文件名和文件格式。
  2. 使用 zip-stream 創(chuàng)建一個 ZIP 實例,用來不斷接收要下載的文件。
  3. 所有文件下載完成就執(zhí)行 close() 方法將所有文件真正打包成一個 zip。

<button id="download">下載</button>

<script src="../StreamSaver.js"></script>
<script src="zip-stream.js"></script>
<script>

    // 要下載的文件地址列表
    let urls = [
        {
            fileName: 'test.txt',
            url: 'http://localhost:9988/public/test.txt',
        },
        {
            fileName: 'test.csv',
            url: 'http://localhost:9988/public/test.csv',
        }
    ]

    download.onclick = () => {
        // 【步驟1】
        const fileStream = streamSaver.createWriteStream('test.zip')

        // 【步驟2】
        const readableZipStream = new ZIP({
            async pull(ctrl) {
                for (let i = 0; i < urls.length; i++) {
                    const res = await fetch(urls[i].url)
                    const stream = () => res.body
                    const name = urls[i].fileName
                    ctrl.enqueue({ name, stream }) // 不斷接收要下載的文件
                }

                // 【步驟3】
                ctrl.close()
            }
        })

        if (window.WritableStream && readableZipStream.pipeTo) {
            return readableZipStream.pipeTo(fileStream).then(
                () => console.log('下載完了')
            )
        }
    }

</script>

點擊下載按鈕后的效果:

StreamSaver.js入門教程:優(yōu)雅解決前端下載文件的難題,前端

這個例子準備了 .csv.txt 文件。下載時會合并成 .zip,解壓后能看到里面的所有文件都是正常能打開的 。



合成文件再下載

在這個例子中,我要將2個 .csv 文件合并成1個再下載。

我準備了兩個 .csv 文件(test1.csv 和 test2.csv),它們的內容分別長這個樣子。

StreamSaver.js入門教程:優(yōu)雅解決前端下載文件的難題,前端

我要將它們合并成這樣子:

StreamSaver.js入門教程:優(yōu)雅解決前端下載文件的難題,前端


在合并文件之前我們首先要清楚這個文件的內容是如何組成的。

在 Excel 中打開 .csv 的每個單元格的內容轉換成文本形式的話是用逗號分隔。

StreamSaver.js入門教程:優(yōu)雅解決前端下載文件的難題,前端

如果要合并多個 .csv 文件,只需監(jiān)聽到每個 .csv 下載完成,然后再拼接一個 \n 換行,再下載下一個 .csv 文件即可。


整理一下就是以下幾個步驟:

  1. 拿到一組下載地址,把它們轉存到一個迭代器里。
  2. 遞歸執(zhí)行迭代器,如果迭代器里還有內容,就使用 fetch 請求數(shù)據(jù)。
  3. 如果迭代器沒內容了,使用 writer.close() 關閉文件寫入。

該功能寫成真正的代碼如下所示:

<button id="download" οnclick="down()">下載</button>

<script src="../StreamSaver.js"></script>
<script>
  // 編碼轉換方法
  let encode = TextEncoder.prototype.encode.bind(new TextEncoder)

  // 準備好要下載的鏈接
  const urls = [
    'http://localhost:9988/public/test1.csv',
    'http://localhost:9988/public/test2.csv'
  ]

  // 迭代器數(shù)據(jù)
  let urlsIter = null

  // 寫入方法放到全局中保存
  let writer = null

  // 下載按鈕點擊事件
  function down() {
    // 創(chuàng)建一個下載管道,并將下載后的文件命名為 newTest.csv
    const fileStream = streamSaver.createWriteStream('newTest.csv')
    // 創(chuàng)建寫入方法
    writer = fileStream.getWriter()
    // 將要下載的鏈接轉換成迭代器
    urlsIter = urls[Symbol.iterator]()

    // 開始執(zhí)行循環(huán)下載
    forDown()
  }

  // 循環(huán)下載的方法
  async function forDown() {
    // 獲取迭代器最新一條數(shù)據(jù)
    let urlIter = urlsIter.next()
    // 如果迭代器沒數(shù)據(jù),執(zhí)行寫入完成操作,并停止遞歸
    if (urlIter.done) {
      writer.close()
      return
    }

    // 迭代器有內容時執(zhí)行請求操作
    await fetch(urlIter.value)
      .then(res => {
        // 通過請求文件url獲取到的數(shù)據(jù)
        const readableStream = res.body
        if (window.WritableStream && readableStream.pipeTo) {
          const reader = readableStream.getReader()
          // 講獲取到的每一包寫入文件里
          const pump = () => {
            return reader.read()
              .then(readRes => {
                if (readRes.done) { // 當前文件讀取完成后執(zhí)行
                  // 文件讀取完成后換行
                  writer.write(encode('\n'))
                  // 執(zhí)行請求下一個文件
                  forDown()
                } else { // 文件讀取過程執(zhí)行
                  // 一包包寫入
                  writer.write(readRes.value)
                    .then(pump)
                }
            })
          }
          pump()
        }
      })
  }
</script>

這個案例稍微復雜一丟丟,建議跟著手敲一遍。



推薦閱讀

除了本文所講內容外,StreamSaver.js 的倉庫還有好幾個實用的例子,有需要的工友可以去看看。


??《前端中文漢字轉拼音》

??《提升日期處理效率:day.js 實戰(zhàn)經(jīng)驗分享》

??《眨個眼就學會了Pixi.js》

??《OpenLayers.js 入門教程:打造互動地圖的入門指南》

??《物理世界的互動之旅:Matter.js入門指南》

??《p5.js 光速入門》


點贊 + 關注 + 收藏 = 學會了 代碼倉庫文章來源地址http://www.zghlxwxcb.cn/news/detail-720284.html

到了這里,關于StreamSaver.js入門教程:優(yōu)雅解決前端下載文件的難題的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 前端vue引入高德地圖入門教程

    前端vue引入高德地圖入門教程

    距離上一篇關于前端項目中使用高德地圖的文章已經(jīng)將近5年之久, 這是我的第一篇關于高德地圖的文章 這期間前端技術日新月異,5年前JQuery還如日中天,如今已經(jīng)銷聲匿跡,很少有公司招聘還在要求JQuery,更多的是Vue、React。 如今更多采用模塊化開發(fā),結合webpack、vite,我

    2024年02月11日
    瀏覽(31)
  • Shopify開發(fā)入門-前端保姆級教程

    Shopify開發(fā)入門-前端保姆級教程

    本文旨在介紹Shopify開發(fā)入門、環(huán)境、配置等,幫助開發(fā)者配置環(huán)境、了解各個開發(fā)模式的區(qū)別及用途;已有Shopify開發(fā)經(jīng)驗者可退出,以免浪費你的寶貴時間。 本文5k字+,圖片、鏈接、代碼塊較多,請耐心閱讀~ 最近在調研Shopify開發(fā),對其也有了一定的認識、了解;即將這些

    2024年02月16日
    瀏覽(46)
  • D3JS教程_編程入門自學教程_菜鳥教程-免費教程分享

    D3是Data-Driven Documents的縮寫,D3.js是一個基于數(shù)據(jù)管理文檔的資源JavaScript庫。 D3 是最有效的數(shù)據(jù)可視化框架之一。它允許開發(fā)人員在 HTML、CSS 和 SVG 的幫助下在瀏覽器中創(chuàng)建動態(tài)的交互式數(shù)據(jù)可視化。數(shù)據(jù)可視化是將過濾后的數(shù)據(jù)以圖片和圖形的形式表現(xiàn)出來。 D3.js入門教程

    2024年02月14日
    瀏覽(18)
  • 跟著pink老師前端入門教程-day03

    跟著pink老師前端入門教程-day03

    6.1 表格的主要作用 主要用于 顯示、展示數(shù)據(jù) ,可以讓數(shù)據(jù)顯示的規(guī)整,可讀性非常好,特別是后臺展示數(shù)據(jù)時,能夠熟練運用表格就顯得很重要。 6.2 基本語法 6.3 表頭單元格標簽 一般表頭單元格位于表格的 第一行或第一列 ,表頭單元格里面的 文本內容加粗居中顯示 ,突

    2024年01月18日
    瀏覽(20)
  • 跟著pink老師前端入門教程(JavaScript)-day02

    跟著pink老師前端入門教程(JavaScript)-day02

    1、什么是變量 白話:變量就是一個裝東西的盒子 通俗:變量是用于存儲數(shù)據(jù)的‘ 容器 ’,通過 變量名 獲取數(shù)據(jù),甚至數(shù)據(jù)可以修改 注意: 變量不是數(shù)據(jù)本身,它們僅僅是一個用于存儲數(shù)值的容器??梢岳斫鉃槭且粋€個用來裝東西的紙箱子。 2、變量在內存中的存儲 本質

    2024年02月20日
    瀏覽(85)
  • Babylon.js入門教程:探索3D世界的新維度

    隨著3D技術的不斷發(fā)展,越來越多的開發(fā)者開始涉足3D領域。在這個領域中,Three.js和Babylon.js是最受歡迎的兩個框架。本文將為大家介紹Babylon.js的入門教程,并與Three.js進行對比,探討它們的優(yōu)缺點。 一、Babylon.js簡介 Babylon.js是一個基于WebGL的開源3D游戲引擎,它可以在瀏覽器

    2024年02月13日
    瀏覽(17)
  • ECMAScript6歷史-前端開發(fā)+ECMAScript+基礎語法+入門教程

    ECMAScript6歷史-前端開發(fā)+ECMAScript+基礎語法+入門教程

    我們首先來看 ECMA 是什么。 ECMA ,讀音類似“??茓尅?,是 歐洲計算機制造商協(xié)會 (European Computer Manufacturers Association)的簡稱,是一家國際性會員制度的信息和電信標準組織。1994年之后,由于組織的標準牽涉到很多其他國家,為了體現(xiàn)其國際性,更名為 Ecma 國際 (Ecma In

    2024年01月16日
    瀏覽(21)
  • 03.Three.js的入門教程(二)如何創(chuàng)建一個3D地球?

    03.Three.js的入門教程(二)如何創(chuàng)建一個3D地球?

    前言:通過上節(jié)課?02.Three.js的入門課程(一),我們了解了Three.js的最小案例DEMO,熟悉了幾個重要組成部分。這節(jié)課帶領大家編寫一個3D地球。 一、通過紋理圖渲染一個地球 1.1. 創(chuàng)建一個紋理加載器對象TextureLoader,可以加載圖片作為紋理貼圖; 1.2.完整代碼結構 二、小球標

    2024年02月04日
    瀏覽(85)
  • 全棧教程:Spring Boot 和 Vue.js 入門

    全棧教程:Spring Boot 和 Vue.js 入門

    在本教程中,你將創(chuàng)建一個 CoffeeBot 應用程序。該應用程序就像機器人咖啡機的控制器。遺憾的是,它實際上不會為你提供咖啡,但它將演示大量有用的編程技術。該應用程序將有一個 Vue.js 客戶端和一個 Spring Boot 資源服務器。它將使用 JHipster 進行引導,節(jié)省大量時間并演示

    2024年02月15日
    瀏覽(19)
  • 前端基礎從頭學——VsCode使用教程+html基礎(入門篇)

    前端基礎從頭學——VsCode使用教程+html基礎(入門篇)

    作者簡介:hello!大家好,初學前端知識,請多多指教。 希望我的分享能夠幫助到更多的人,如果覺得我的分享有幫助的話,請大家一鍵三連支持一下哦~ ———————————————————————————— 剛接觸前端,零基礎小白,從頭開始學起,請大家多多指

    2024年01月18日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包