request流形式下载文件,文件保存不完整
发布于 8 年前 作者 jiangli373 6116 次预览 最后一次回复是 8 年前 来自 问答
使用request模块,下载服务器上的文件,使用stream的方式下载,如果先pause下,过段时间在resume,最后下载下来的文件 不完整,服务器上的文件是正常的
代码如下所示:
'use strict';
const request = require('request');
const timeout = 1000 * 60 * 3;
const fs = require('fs');
const path = require('path');
const sss = path.join(__dirname, '123123213.dmg');
const url = 'http://p2oryw9jc.bkt.clouddn.com/charles-proxy-4.1.4.dmg';
let inStream = request.get(url);
inStream.pause();
inStream.pipe(fs.createWriteStream(sss));
setTimeout(() => {
inStream.resume()
}, timeout)
请问这是原因造成的呢,谢谢大家了
6 回复
我没有尝试过类似的事情,但是是否可以监听一下response事件或者error时间,打印一下? 类似: inStream .on(‘response’, function(response) { console.log(response); }) .on(‘error’, function(err) { console.log(err); });
@guo-q
data 事件 会接受到部分数据
error 事件
我感觉貌似是请求断开了 response 事件
来自酷炫的 CNodeMD
inStream.on(‘error’, () => console.log(error)), read timeout 在 linux 中一般都是 20 ~ 120s,出现这个问题一般都是服务端主动断开了, 应该就是在120s那个点左右,你可以把 timeout 设置小点, 或者服务端 timeout 设置大点
@jiangli373 实验了一下 timeout的时间变小确实可以完整下载你的内容,你出现的问题应该是在pause的时候服务器主动断开了连接,不知道你的业务场景是什么。
服务端主动断开了连接。
@guo-q @mosaic101 @JacksonTian 谢谢各位的回答了 现在的业务场景是服务器端需要做文件打包下载,然后文件都是保存在云存储上的,然后我这里选择的解决方案是 jszip + request
jszip添加stream
然后现在遇到问题的是如果有多个文件的话,会添加多个file,就像上面的形式,但是我研究了下jszip的源码,貌似如果对多个文件的话,是先把stream放在一个数组里面的,然后依次执行,其它的stream会先pause,等前一个执行完成后,下一个stream会resume,这样会出现上面的问题。 下面是我的一个测试代码