Angular 集成 StreamSaver
应用场景:
实现目标: 在网页端实现大文件(文件大小 >= 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;
} }
最后重启 nginx , 就将授信 https 服务器改为了自己的服务器.
如果使用的是自签名证书, 又没有在用户电脑安装证书, 需要在浏览器添加如下配置:
--ignore-certificate-errors
Angular 集成 StreamSaver的更多相关文章
- Angular集成UEditor
1.Ueditor的集成主要通过把UEditor做成一个Component来实现,先上Component代码: import { AfterContentInit, Component, Input, ...
- angular集成tinymce
1.前言 我使用的是angular的7.x版本,和之前的低版本集成方式有所区别.这里记录下基本的集成步骤. 2.集成步骤 2.1安装tinymac包 npm install tinymce --sav ...
- Angular集成admin-lte框架
其实上一篇里面提到的集成datatables.net就是admin-lte里面的一个子插件,不过这个子插件,他是自带types定义文件的,admin-lte这个东西在DefinitelyTyped里面 ...
- PrimeNG01 angular集成PrimeNG
1 开发环境 本博文基于angular5 2 步骤 2.1 创建angular5项目 详情参见百度 2.2 下载PrimeNG依赖 npm install primeng --save npm ins ...
- angular 与 layer 集成过程
layer 的提示框和弹层确实也好用,在使用angular的前提下,使用layer遇到诸多麻烦,记录下来. 在类型是1页面层,主要问题在遮罩方面,造成无法编辑. 开始:引入layer 样式,angul ...
- Angular + Leaflet 实现房源数据可视化(附github源码)
这是什么?租房信息展示平台 宏观的租房数据可视化微观的房源信息展示多条件搜索等等 链接地图搜租房 来龙去脉 受 @李国宝 的地图搜租房启发,利用其提供的开放API,配合自己在前端和地理信息系统方面的 ...
- AngularJS集成富文本编辑器
最近在Angular中需要集成富文本编辑器,本来已经集成好百度的UEditor,后台觉得配置太多,让我弄个别的,然后就找到了wangEditor,这个配置和上手都要简单一些,下面来看看具体操作步骤吧: ...
- ABP框架 - 动态Web Api层
文档目录 本节内容: 创建动态Web Api控制器 ForAll 方法 重写 ForAll ForMethods Http 动词 WithVerb 方法 HTTP 特性 命名约定 Api 浏览器 Re ...
- ABP官方文档翻译 6.7 CSRF/XSRF保护
CSRF/XSRF保护 介绍 HTTP动词 非浏览器客户端 ASP.NET MVC 特征 集成 布局视图 配置 ASP.NET Web API 特征 集成 集成到ASP.NET MVC客户端 集成到其 ...
- iot前台开发环境:搭建 SpringBoot+angularJs2
参考网站 Angular 中文官网:https://angular.cn/ 参考代码:https://ng.ant.design/#/components/dropdown npm install ...
随机推荐
- 新型DDoS来袭 | 基于STUN协议的DDoS反射攻击分析
简介: 作为新型反射类型,目前仍存绕过防御可能性. 阿里云安全近期发现利用STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)服务发起的DDoS反 ...
- PyFlink 教程(三):PyFlink DataStream API - state & timer
简介: 介绍如何在 Python DataStream API 中使用 state & timer 功能. 一.背景 Flink 1.13 已于近期正式发布,超过 200 名贡献者参与了 Fl ...
- Python静态类型解析工具简介和实践
简介: Python是一门强类型的动态类型语言,开发者可以给对象动态指定类型,但类型不匹配的操作是不被允许的.动态类型帮助开发者写代码轻松愉快,然而,俗话说:动态一时爽,重构火葬场.动态类型也带来了许 ...
- [Go] 浅谈 Golang Chan 通信与死锁:all goroutines are asleep - deadlock
Channel创建方式: var c1 chan [value type] c1 = make([channel type] [value type], [capacity]) [value type ...
- WPF 通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸转换过来
本文将告诉大家如何在 WPF 或者其他 Win32 应用里面,在收到鼠标消息时,通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸消息提升而来 大家都知道,在不开启 W ...
- Sentinel如何持久化数据到Nacos?
默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但不能将自己控制台修改的信息同步给 Nacos,如下图所示: 但是在生成环境下,我们为了更方便的操作,是需要将 Sentinel 控制 ...
- 10.Sidecar代理:日志架构
官方文档:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/ 题目:Sidecar代理 设置配置环境ku ...
- centos7虚拟机部署netcore3.1服务供局域网访问
如果买了亚马逊.腾讯.阿里等服务器,基本上几分钟就可以跑aspnetcore,外网访问分分钟.但是便宜点的服务器访问速度就没那么理想.这时候就需要考虑零成本的虚拟机部署了,当然这个基本都是局域网做测试 ...
- vue-苟曰的老板不发工资230行原创js代码写个扫雷小游戏
上gif: 1.开局提示动画 2.游戏中状态提示 3.开挂模式提示 4.计时器 5.游戏模式扫雷成功,蓝色进度条表示当次扫雷的完成度 6.若当次时间小于最佳记录,则更新最佳记录,如果最佳记录小于设置的 ...
- Git实战技巧:恢复被强制push -f失踪的代码
前言 Git是一个易学难精的分布式版本控制系统,被我们码农常用于代码的管理.如果你还不了解Git,建议先通过廖雪峰的Git教程进行了解,再来看本文,因为本文以使用技巧为主,不会在基础名词上做过多解释. ...