一、目的:
最近在写C#这方面的东西,有个功能是从服务器下载大型文件到浏览器上。因为这套服务是部署在服务器上的,用户可以根据网址访问页面,用户在页面上点击按钮,下载ZIP文件。
我之前的方案是对大文件直接获取,返回成文档流,前端再接收文档流,生成a链接下载。但是如果是大文件,这个进程就会很慢,不满足需求。
在网上也查找了很多解决方案,从前端到后端。最终决定用对大文件分块进行传输,前端接收的方案。
经测试:4GB大小的文件,原始方案用时3分30秒,新方案用时1分30秒(如果分的块大,速度可能更快)
二、实现思路:
1、后端:
① 根据文件地址获取ZIP文件
② 获取该ZIP文件的字节大小
③ 循环处理,将文件划分成一个个小的模块
④ 创建请求头,将划分好的文件持续传递到前端
2、前端:
① 由于后端传输是一个长期的过程,那就需要前端将分成块的文件流全部获取
② 解析后端返回的 response 对象,其中 response.body 是一个 ReadableStream 对象,需要对该对象进行读取,并重新生成一个新的 ReadableStream 对象
③ 将新生成的 ReadableStream 对象,转化为 Blob
④ 对Blob对象生成A链接下载