Node JS Express - 在标头响应中发送所有文件后才会出现下载窗口

问题描述 投票:0回答:1

我正在与 Express 合作创建一个允许下载 PDF 文件的 api。 下载工作正常,但在网络连接中完成所有“下载”之前,我看不到选择要下载的文件夹的下载窗口。

在此输入图片描述

此 pdf 为 22Mb。

这是我的代码的一部分:

const filePath = path.join(__dirname, serverPath.replace(/[/\\]/g, path.sep))
    const fileStream = fs.createReadStream(filePath)

     fileStream
      .on('error', (error) => {
        next(error) // --> Send error to middleWare
      })
      .on('end', () => {
        logger.info(`${order} - File:${pathDB.fileName} from ${filePath} correctly Downloaded`)
      })

    // send file in https response, "blob" type
    res.setHeader('Content-Disposition', 'attachment; filename=' + pathDB.fileName)
    res.setHeader('Content-Type', 'application/octet-stream')
    fileStream.pipe(res)

我尝试添加内容长度但不起作用。

const stat = fs.statSync(filePath);
const fileSize = stat.size;

res.setHeader('Content-Length', fileSize); // Set the Content-Length header

我应该如何管理它以允许用户在下载所有 pdf 之前选择下载文件夹?

例如,我在AMD驱动程序网站上看到,当您单击下载响应发送200b对象时,会弹出下载窗口,当您接受时,整个文件都会被下载。 https://www.amd.com/en/support/download/drivers.html

谢谢并致以诚挚的问候

javascript node.js express download filestream
1个回答
0
投票

这是因为您正在尝试流式传输数据,数据会以块的形式传入并存储在客户端浏览器缓存中,然后加入,就像您从 mega.io 下载文件时的情况类似

要让您的 API 下载数据,请使用以下命令:-

res.download("pdf_name.pdf")

或者您可以使用

sendFile()
代替。它仅用于从文件发送数据,而不是从内存发送数据。因此,它不是内存密集型的,但在高上传速率期间可能是服务器 CPU 密集型的,这可能会受到限制,请检查此 -> 链接

© www.soinside.com 2019 - 2024. All rights reserved.