【发布时间】:2020-09-21 16:45:09
【问题描述】:
我正在使用 axios post 方法从远程服务器下载文件,然后保存到磁盘。 文件保存到磁盘后,我需要将其发送给客户端作为响应。
let response = await axios.post(url, body, {headers :headers, responseType:'stream'})
let filePath = "reports/" + response.headers['content-disposition'].split("filename=")[1].replace(/\"/g, "");
await response.data.pipe(fs.createWriteStream(filePath))
res.download(filePath);
我面临的问题是,在文件写入仍在进行时发送响应。 如果有任何替代方案,请提出建议。
编辑:- 问题出在写入流上。
解决方案:-
let response = await axios.post(url, body, {headers :headers, responseType:'stream'});
let filePath = "reports/" + response.headers['content-disposition'].split("filename=")[1].replace(/\"/g, "");
let ws = fs.createWriteStream(filePath);
new Promise((resolve, reject) => {
ws.on('open', () => {
response.data.pipe(ws);
}).on('error', function (err) {
reject(res.send({error: "message"}));
}).on('finish', function () {
ws.end();
resolve(res.download(filePath));
});
});
【问题讨论】:
-
当您说在文件写入时发送响应时,您的意思是发送了超时事件?如果是这样,您需要增加服务器超时时间(此 obv 不会像文件那样扩展到无穷大很大),否则您将不得不使用
socket连接。 -
不,响应是用 0 kb 的文件发送的。如果我在发送响应之前添加 1 秒的延迟,它会起作用。
标签: node.js file express axios