首页 > 系统相关 >Http Fetch+StreamSaver.js在内存有限的设备下载大文件

Http Fetch+StreamSaver.js在内存有限的设备下载大文件

时间:2023-09-20 09:56:15浏览次数:56  
标签:文件 Http js mitm https 服务器 StreamSaver

目前前端没有很好的api支持流式的文件的分片下载。如果直接把整个文件保存到Blob对象中再保存,有可能出现很多不可以预期的问题,可能会因为达到浏览器的Blob对象上限而下载失败。也有机会因为客户端内存太低而导致OOM。那如果我们有额外的文件服务器的话,可以选择把文件先导出到文件服务器,然后前端再通过文件路径由浏览器处理下载。但是如果又没有额外的文件服务器,又想要支持分片下载,这就是这篇文章的主题。

StreamSaver.js的工作原理

StreamSaver.js采用了不同的方法。现在,您可以创建一个直接到文件系统的可写流,而不是将数据保存在客户端存储或内存中(我说的不是chromes沙盒文件系统或任何其他网络存储)。这是通过模拟服务器如何指示浏览器使用某个响应头+服务工作者来保存文件来实现的 如果您试图保存的文件来自云/服务器,请使用服务器,而不是模拟浏览器使用StreamSaver在磁盘上保存文件的操作。添加那些额外的响应头,不要使用AJAX来获取它。FileSaver有一个很好的关于使用头的wiki。如果您无法更改标题,那么您可以使用StreamSaver作为最后手段。FileSaver、streamsaver和其他类似的应用程序主要用于浏览器内客户端生成的内容。

StreamSaver.js通过伪造一个服务器文件的链接,伪造的服务器收文件下载到请求返回Content-Disposition头告诉浏览器开始下载文件。但实际上这个文件服务器并不存在并且内容也不在服务器上。因此,他的解决方案是创建一个Service Worker(sw.js),它可以拦截请求并使用responsdWith()伪装成服务器。

中间人MITM

既然是伪造的服务器,那必然涉及到中间人,默认StreamSaver.js的MITM是https://jimmywarting.github.io/StreamSaver.js/mitm.html?version=2.0.0。

如果你的客户端是联网的而且是可以访问github那没有问题,那如果你的站点是内网或客户端根本无法访问github那就悲剧了,下载根本就不会触发。

 在JavaScript中,MITM代表"Man-in-the-Middle",这是一种网络攻击技术。在这种攻击中,攻击者秘密地插入他们自己的设备或软件,从而在一个两方或多方的通信中间接收、修改、甚至拦截消息。这种攻击可以在没有任何一方知道的情况下进行。在JavaScript中,你可能会在谈到网络安全性时听到MITM,尤其是在处理如HTTPS这样的安全协议时。在这些情况下,JavaScript可能会使用一些API或技术(例如Service Workers)来尝试防止或检测MITM攻击。

自部署MITM:

  • 下载文件
  1. https://github.com/jimmywarting/StreamSaver.js/blob/master/mitm.html
  2. https://github.com/jimmywarting/StreamSaver.js/blob/master/sw.js
  • 把文件放入你的项目

目录:./public

StreamSaver.js整合

  • 安装
npm install streamsaver --save
  • 下载方法封装
import * as streamSaver from 'streamsaver'

export async function download(url, parameters, fileName) {
  streamSaver.mitm = 'https://xxxx/mitm.html?version=2.0.0'
  const fileStream = streamSaver.createWriteStream(fileName)
  return fetch(url, {
    method: 'POST',
    body: JSON.stringify(parameters),
    cache: 'no-cache',
    headers: {
      'Content-Type': 'application/json'
    }
  }).then(res => {
    const readableStream = res.body
    if (window.WritableStream && readableStream.pipeTo) {
      return readableStream.pipeTo(fileStream)
    }
    window.writer = fileStream.getWriter()
    const reader = res.body.getReader()
    const pump = () => reader.read()
      .then(res => res.done
        ? window.writer.close()
        : window.writer.write(res.value).then(pump))
    pump()
  })
}
  • MITM设置
如果是本地调试,可以设置:
streamSaver.mitm = 'http://localhost:9527/mitm.html?version=2.0.0'
上线后设置为线上地址: streamSaver.mitm = 'https://xxxx/mitm.html?version=2.0.0'

 

参考:

 

转载请注明出处:https://www.cnblogs.com/keitsi/p/17715177.html

标签:文件,Http,js,mitm,https,服务器,StreamSaver
From: https://www.cnblogs.com/keitsi/p/17715177.html

相关文章

  • nodejs的安装配置
    node.js的介绍Node.js是一个基于ChromeJavaScript运行时建立的平台,用于方便地搭建响应速度快、易于扩展的网络应用。Node.js使用事件驱动,非阻塞I/O模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型的实时应用。V8引擎执行Javascript的速度非常快,性能非常好。N......
  • HTTP请求中,几种常见的Content-Type类型
    一、application/x-www-form-urlencoded最常见的POST提交数据的方式,原生Form表单,如果不设置enctype属性,默认为application/x-www-form-urlencoded方式提交数据。首先,Content-Type被指定为application/x-www-form-urlencoded;其次,提交的表单数据会转换为键值对并按照key1=v......
  • IIS 部署的应用禁用HTTP TRACE / TRACK方法【原理扫描】
     TRACE和TRACK是用于调试Web服务器连接的HTTP方法。直接在网站Web.config文件中进行如下操作:在Web.config中的<system.webServer>节点内添加以下配置即可:<security><requestFiltering><verbs><addverb="OPTIONS"allowed="false"/><addverb="Trace"......
  • js 前端 时间日期 月份 日期不满10 前面加0
    法一://获取当前日期的yyyy-MM-dd格式vardate=newDate();varyear=date.getFullYear();varmonth=date.getMonth()+1<10?"0"+(date.getMonth()+1):date.getMonth()+1;varday=date.getDate()<10?"0"+date.getDate():date.get......
  • 安装nodejs
    http://nodejs.cn/download/在nodejs安装目录下,创建“node_global”和“node_cache”两个文件夹 把【node_global】的路径“E:devToolsodejsode_global”加入到【系统变量】下的【PATH】变量中,方便直接使用命令行运行 再次执行npmconfiggetregistry,检......
  • Node.js ORM Sequelize All In One
    Node.jsORMSequelizeAllInOneSequelizeisaneasy-to-useandpromise-basedNode.jsORMtoolforPostgres,MySQL,MariaDB,SQLite,DB2,MicrosoftSQLServer,andSnowflake.Itfeaturessolidtransactionsupport,relations,eagerandlazyloading,read......
  • HTTP安全响应头配置之X-Frame-Options
    目的这个header主要用来配置哪些网站可以通过frame来加载资源。它主要是用来防止UIredressing补偿样式攻-击。IE8和firefox18以后的版本都开始支持ALLOW-FROM。chrome和safari都不支持ALLOW-FROM,但是WebKit已经在研究这个了。正确的设置DENY–禁止所有的资源(本地或远程)试图通......
  • 在pycharm中如何对json格式文件数据标准化
    打开pycharm里面的json文件之后,想要将其标准化,就直接使用快捷键:Ctrl+Alt+L即可;效果如图所示:意满离~~......
  • Python 如何把 String 转换为 Json 对象
    在我们对JSON进行处理的时候,大概率我们会需要把字符串转换为JSON对象后才能进行处理。Python贴心的使用json.loads(employee_string)就可以了。首先需要做的就是导入JSON库。#includejsonlibraryimportjson对现代程序员来说,JSON数据结构基本上是非常常见的数据结构了,几......
  • 第05章-自定义函数和JSON数据解析
    目录5.1实现自定义UDF25.2实现自定义UDTF35.3实现自定义UDAF45.4解析JSON数据65.4.1解析OBJECT数据65.4.2解析ARRAY数据75.4.3禁止使用get_json_object函数8第05章自定义函数和JSON数据解析自定义函数简介有一些sql很难处理的逻辑,我们可以使用自定义函数去处理。比......