Angular 集成 StreamSaver 大文件下載

来源:https://www.cnblogs.com/shuyuanutil/p/18247466
-Advertisement-
Play Games

應用場景: 實現目標: 在網頁端實現大文件(文件大小 >= 2 G) 斷點續傳 實際方案: 發送多次請求, 每次請求一部分文件數據, 然後通過續寫將文件數據全部寫入. 難點: 無法實現文件續寫, 最後採用 StreamSaver 來解決這個問題. 1. 首先從 git hub 將 StreamSav ...


應用場景:

實現目標: 在網頁端實現大文件(文件大小 >= 2 G) 斷點續傳

實際方案: 發送多次請求, 每次請求一部分文件數據, 然後通過續寫將文件數據全部寫入.

難點: 無法實現文件續寫, 最後採用 StreamSaver 來解決這個問題.

 

1. 首先從 git hub 將 StreamSaver 拉取下來.

StreamSaver gitHub 項目地址: GitHub - jimmywarting/StreamSaver.js: StreamSaver writes stream to the filesystem directly asynchronous

(這裡推薦使用將 StreamSaver.js 文件直接放到項目中, 因為 StreamSaver 的實現需要藉助已授信 https 伺服器,

如果不配置自己的 https 伺服器, 會訪問 StreamSaver.js 預設已授信 https 伺服器, 來實現下載功能

如果使用的是自簽名的 https 伺服器, 需要將證書安裝在用戶電腦或用戶瀏覽器端進行一些配置才可正常使用, 稍後會講到)

 

2.將 js 庫導入 Angular 項目, 能在 ts 文件中調用 js 庫的函數, 變數.

2.1 將 StreamSaver.js 文件放在 Angular 項目 assets\utils-js 目錄下

 

 2.2 然後在 index.html 的 head 標簽中添加腳本, 如下:

<head>
    ... 其他代碼
    <script type="text/javascript" src="assets/utils-js/StreamSaver.js"></script>
</head>

 

2.3 隨後在要使用 StreamSaver.js 的 ts 文件中聲明

file-handle.ts

declare const streamSaver: any;
export class FileHandle {
  static createWrite(fileName: string) {
    if (!fileName) throw new Error('文件名不能為空');
    // 如果沒有自己已授信的 https 伺服器, 下麵 streamSaver.mitm = 'https://xxx_ip:xxx_port/other/mitm.html?version=2.0.0'; 可刪除. 
    // 會走預設伺服器: https://jimmywarting.github.io/StreamSaver.js/mitm.html?version=2.0.0
    streamSaver.mitm = 'https://xxx_ip:xxx_port/other/mitm.html?version=2.0.0';
    // 創建一個可寫流
    return streamSaver.createWriteStream(fileName).getWriter();
  }
}

 

 

補充: 如果使用 npm 安裝使用 streamsaver, 在配置另外授信的 https 伺服器的時候, ts 會報錯, 所以最好還是將 StreamSaver.js 文件直接放到項目中使用.

import * as streamSaver from 'streamsaver';

streamSaver.mitm = 'https://xxx_ip:xxx_port/other/mitm.html?version=2.0.0'; 

npm i streamsaver

npm i @types/streamsaver

 

3. 使用 streamSaver 完成下載
download = () => {
    const writer = FileHandle.createWrite();
    // 偽代碼
    for(let i = 0; i++; i <= 10) {
        this.http.post('/download', ...).subscribe(next => {
            writer.write(next);
        });
    }
    write.end();
}

 

4. 如果下載文件不想藉助 StreamSaver 預設的 https 伺服器, 需要在 nginx 伺服器進行如下配置

註意: 

nginx 配置的 "other" 路由應當和代碼中的 streamSaver.mitm = 'https://xxx_ip:xxx_port/other/mitm.html?version=2.0.0'; 對應起來
# https
server {
    listen  	9999ssl;
    listen  [::]:9999 ssl;
    server_name    0.0.0.0;

    ssl_certificate     /etc/nginx/my-ssl/sss.crt; # crt
    ssl_certificate_key /etc/nginx/my-ssl/sss.key; # key

    ssl_session_cache   shared:SSL:1m;
    ssl_session_timeout 5m;


	ssl_protocols TLSv1.3;
    ssl_ciphers 'HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES';
    ssl_prefer_server_ciphers on;

    location / {
      root   /fornt/my-app;
      index  index.html index.htm;
      try_files $uri $uri/ /index.html;
    }

    location ^~/api {
      proxy_pass https://127.0.0.1:8888;
    }

    location ^~/other/mitm.html {
          alias   /streamsaver/mitm.html;
    }
    location ^~/other/sw.js {
      alias   /streamsaver/sw.js;
    }
    location ^~/other/ping {
      alias   /streamsaver/sw.js;
    }

}   
將 mitm.html 和 sw.js 文件放到 nginx 伺服器  /streamsaver 目錄下

最後重啟 nginx , 就將授信 https 伺服器改為了自己的伺服器.

 如果使用的是自簽名證書, 又沒有在用戶電腦安裝證書, 需要在瀏覽器添加如下配置:

 --ignore-certificate-errors

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要:本文闡述了Nuxt.js作為基於Vue.js的伺服器端渲染框架,其在提升Web開發效率、確保代碼質量和優化應用性能方面的核心價值。通過詳盡的安裝步驟、配置說明、常見問題解決策略及進階部署方法,為開發者搭建和部署Nuxt.js項目提供了全方位指導。 ...
  • JS中有一些操作可以動態地執行JS代碼,並修改或新建詞法作用域,這種操作雖然帶來了更多的靈活性,但是會嚴重地影響到性能。 ...
  • 1. 不使用臨時變數來交換變數的值 2. 對象解構,讓數據訪問更便捷 3. 淺克隆對象 4. 合併對象 5. 清理數組 6. 將 NodeList 轉換為數組 7. 檢查數組是否滿足指定條件 8. 將文本複製到剪貼板 9. 刪除數組重覆項 10. 取兩個數組的交集 11. 求數組元素的總和 12. ... ...
  • 這篇文章介紹了Web Components技術,它允許開發者創建可復用、封裝良好的自定義HTML元素,並直接在瀏覽器中運行,無需依賴外部庫。通過組合HTML模板、Shadow DOM、自定義元素和HTML imports,Web Components增強了原生DOM的功能,提高了組件化開發的封裝性和... ...
  • 隨便寫的小網頁練習: 原視頻:十分鐘學會寫網頁【編程前端入門】 簡介: 本期重做了好幾遍,是全新的視角和概念,從瀏覽器底層渲染原理到實現網站的演示,一節課講透,必看的一期。後面不管是寫小程式還是App,都會用到這一期的概念。 這一期內容是我做完第一章個人網站後更新的,用來替代原先沒做好的第三節, ...
  • 這篇文章介紹了微前端架構概念,聚焦於如何在Vue.js項目中應用Qiankun框架實現模塊化和組件化,以達到高效開發和維護的目的。討論了Qiankun的原理、如何設置主應用與子應用的通信,以及如何解決跨域問題和優化集成過程,從而實現前端應用的靈活擴展與組織。 ...
  • ‍ 寫在開頭 點贊 + 收藏 學會 在日常的開發過程中,我們都會有一些常用的代碼片段,這些代碼片段可以直接複製到各個項目中使用,非常方便。如果你有接手過別人的項目,就可以很明顯感受到幾個項目一般都會有一些相同的工具類方法,這些方法就是之前開發者的常用代碼片段。 現在前端社區相當完 ...
  • 這篇文章介紹瞭如何在Vue框架中實現自定義渲染器以增強組件功能,探討了虛擬DOM的工作原理,以及如何通過SSR和服務端預取數據優化首屏載入速度。同時,講解了同構應用的開發方式與狀態管理技巧,助力構建高性能前端應用。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...