首页 > 其他分享 >Angular 集成 StreamSaver 大文件下载

Angular 集成 StreamSaver 大文件下载

时间:2024-06-14 11:23:26浏览次数:10  
标签:集成 StreamSaver html js ssl mitm https Angular

应用场景:

实现目标: 在网页端实现大文件(文件大小 >= 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

 

标签:集成,StreamSaver,html,js,ssl,mitm,https,Angular
From: https://www.cnblogs.com/shuyuanutil/p/18247466

相关文章

  • SpringBoot集成MyBatis-Plus
    SpringBoot集成MyBatis-Plus代码生成器背景​ MyBatis-Plus代码生成器相较于MyBatis代码生成器,可以多生成controller层和service层,并且配置更丰富,通过对Freemarker默认模板的修改和增加自定义模板配置适配,可提升开发效率操作步骤项目目录结构MyFreemarkerTemplateEngine继......
  • 从零开始的模拟集成电路设计(2):软件的使用与二输入与非门的设计仿真
     从零开始的模拟集成电路设计(1):软件的使用与简单数字集成电路的设计仿真-CSDN博客上接前文:我们在前面的课程中已经学会了如何设计一个简单的数字集成电路:反向器,现在我们继续学习下一个非常实用的数字集成电路:与非门。学习目的:1.掌握集成电路模拟仿真的基本流程2.掌握集成电......
  • 模拟集成电路设计系列博客——7.1.1 逐次比较型ADC基本介绍
    7.1.1逐次比较型ADC基本介绍实现数模转换器(ADC)的架构可以粗略的分成三种,如下表所示,分别为低到中速ADC,中速ADC和高速ADC:在开始之前,需要注意在讨论ADC设计时,我们一般会忽略AD传输特性中的0.5LSB偏移。采用这个简化是为了不将暂时的概念复杂化。许多转换器架构大量使用了开关电容......
  • Angular Material 18+ 高级教程 – Material Form Field
    介绍FormField或TextField是MaterialDesign独有的设计风格。它长这样注:MaterialDesign管它叫TextField,AngularMaterial管它叫FormField。我们不要乱,本篇统一叫FormField就好。顾名思义,Form代表表单,Field代表<fieldset>里的field。拿一个 W3Schools......
  • 模拟集成电路设计系列博客——6.4.2 分段转换器
    6.4.2分段转换器分段转换器是实现混合转换器的一种非常流行的方式[Schoeff,1979;Grebene,1984;Schouwenaars,1988]。一个6比特分段DA转换器如下图所示:使用这种方式,两位MSB电流通过温度计编码方式,从三个相等的电流源中进行获取。高位通过开关连接到输出,低位呗开关连接到地......
  • 模拟集成电路设计系列博客——6.4.1 电阻电容混合转换器
    6.4.1电阻电容混合转换器在混合设计中,需要以不同的比例组合前三章中讨论的三种技术。混合设计是设计DA转换器中的一种流行方式,因为它能够组合不同方式的优点。例如,在设计中经常使用温度计码处理高几位MSB,而使用二进制码方式处理低几位LSB。使用这种方式,对于最需要处理毛刺以及高......
  • Ruoyi集成flyway后启动报错的解决方法
    ruoyi系列框架是开源中非常好的源码平台,使用宽松的开源协议进行源代码的开放。不管是单体版、前后端分离甚至是微服务架构,均提供了相应的代码。基于ruoyi可以做自己的后台系统,也可以学习很多技术的集成。而flyway是java里面的数据库脚本自动管理工具,使用flyway可以在应用程序升级......
  • 微服务架构qiankun集成react子应用
    前一篇文章讲了qiankun集成vue子应用,这篇随笔讲集成react子应用。1、创建react子应用用react脚手架初始化一个react项目,至于项目的数据仓库store和路由、以及UI组件库这里就不做讲解,可以自己自行网上找资料配置。create-react-appmy-react-app2、在src路径下创建publicPat......
  • MAX3160EAP 集成接口芯片 收发器 资料配置流程
    MAX3160EAP是一款集成电路(IC),它是一个全双工的RS-232/RS-485/422多协议收发器。这个器件可以通过编程来配置为不同的模式,包括两个RS-232接口或一个RS-485/422收发器。它具有许多高级特性,比如真正的安全接收器、保护传输和接收器不受线路故障的影响、低功耗待机模式以及能够在......
  • 2024年广西职业院校技能大赛 工业互联网集成应用赛项 样题1
    目录一、平台硬件、软件组成说明二、任务要求模块一工业互联网设备安装与调试(35分)任务1-1工业互联网设备安装任务1-2.工业互联网设备互联任务1-3.工业互联网设备调试任务1-4.HMI添加采集数据曲线模块二工业互联网平台开发应用(60分)任务2-1边缘计算及数据可视化......