【问题标题】:Save file to disk and then download in Node将文件保存到磁盘,然后在 Node 中下载
【发布时间】: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));
 });
});

链接:-fs.createWriteStream does not immediately create file?

【问题讨论】:

  • 当您说在文件写入时发送响应时,您的意思是发送了超时事件?如果是这样,您需要增加服务器超时时间(此 obv 不会像文件那样扩展到无穷大很大),否则您将不得不使用socket 连接。
  • 不,响应是用 0 kb 的文件发送的。如果我在发送响应之前添加 1 秒的延迟,它会起作用。

标签: node.js file express axios


【解决方案1】:

我认为你应该在继续之前使用 Promise.All 来解决所有的承诺。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 2013-12-19
      相关资源
      最近更新 更多