将文件保存到磁盘,然后在 Node 中下载



我正在使用 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));
});
});

链接:- fs.createWriteStream 不会立即创建文件?

我认为你应该使用Promise.All来解决所有承诺,然后再继续。

据我所知,response.data.pipe不是一个承诺,所以await不会起作用。 尝试:-

response.data.pipe(fs.createWriteStream(filePath), {end: false})
response.data.on('end', ()=> res.download(filePath))

最新更新