当前位置: 首页 > 知识库问答 >
问题:

从GridFS流节点下载文件JS后端/ React前端

郎伟兆
2023-03-14

我已经设置了一个GridFS流来处理zip文件,如果我在浏览器中输入API url,zip文件就会下载到我的计算机上,这正是我想要发生的。然而,当我从前端React应用程序发出get请求时,我得到的是一个数据对象,没有下载效果。我已经可以使用window.location.href下载了,但是我已经在产品中测试过了,它只是把我发送到那个本地主机URL(在产品中不存在)。只是想对此有所了解,我的目标是用户可以点击一个下载按钮,zip文件就会发送给用户并开始下载。谢谢!!

共有2个答案

鲁钱明
2023-03-14

您应该在服务器响应中设置标头 Content-Disposition: 附件; filename=“filename.jpg”。

印瑾瑜
2023-03-14

如果有人遇到同样的问题,我决定回答我自己的问题。要从GridFS流下载文件,请在axios请求中包含responseType:'blob'。然后使用客户端文件库(如FileSaver)保存文件。

还要确保在后端路由中包含适当的标头。

客户端.js

onDownloadSampleClick = () => {
    axios({
      method: "GET",
      url: "/api/test/stream/90b7d1d5ed550882284dcf6f62774963.zip",
      responseType: "blob"
    })
      .then(response => {
        this.setState({ fileDownloading: true }, () => {
          FileSaver.saveAs(response.data, "sparta_sample_pack.zip");
        });
      })
      .then(() => {
        this.setState({ fileDownloading: false });
        console.log("Completed");
      });
  };

Gridfs路线

router.get("/api/test/stream/:filename", (req, res) => {
  res.set({
    "Accept-Ranges": "bytes",
    "Content-Disposition": `attachment; filename=${req.params.filename}`,
    "Content-Type": "application/zip"
  });
  gfs.files.findOne({ filename: req.params.filename }, (err, file) => {
    if (!file || file.length === 0) {
      return res.status(404).json({
        error: "That File Doesn't Exist"
      });
    }
    if (file.contentType === "application/zip") {
      // Read output to browser
      const readstream = gfs.createReadStream(file.filename);
      readstream.pipe(res);
    } else {
      res.status(404).json({
        error: "This is not an zip file"
      });
    }
  });
});
 类似资料:
  • 当用户点击下载按钮时,文件应该被下载,而不会在新标签中打开文件预览。如何实现这在反应js?

  • 问题内容: 我收到来自api的文件网址作为响应。当用户单击“下载”按钮时,应在不打开新选项卡的文件预览的情况下下载文件。如何在React JS中实现这一目标? 问题答案: 从前端触发浏览器下载不可靠。 您应该做的是创建一个端点,该端点在被调用时将提供正确的响应头,从而触发浏览器下载。 前端代码只能做很多事情。例如,取决于浏览器,“下载”属性可能只是在新标签中打开文件。 您需要查看的响应标头可能是和

  • 所以我在运行一个节点。js服务器和mongoose,我一直试图使用GridFS节点包下载一个大文件,但我一直收到以下错误: MongoServerError:find命令::期间执行器错误,原因是::Sort超出了104857600字节的内存限制,但未选择外部排序。 下面是我用来下载文件的代码: 鉴于在 StackOverflow 上回答您自己的问题是可以的,我想记录这个问题,以便我的解决方案可以

  • 我正在尝试使用Node fetch下载一个typescript(Node.js)文件。 根据文档和此处的堆栈溢出答案,以下代码应该可以工作: 但我得到以下错误: 我还检查了类型文件中节点获取类型的响应。它没有管道功能。 我在这里检查了节点获取的类型定义,根据这里的接口,响应的主体似乎是一个可读的流: } 并有一个函数pipeTo(我从这里的留档中找到了这个。我在浏览了提到的留档后尝试运行以下代码:

  • 最近我开始使用node。js。当我在我的一个项目中完成一个需求时,我面临一个问题,我应该能够将一些数据动态写入csv文件,并让它作为弹出窗口提示用户下载(如我们通常看到的,带有保存和取消选项)。在谷歌搜索了一段时间后,我决定使用csv npm模块https://github.com/wdavidw/node-csv-parser.我能够将数据写入文件并使用此模块进行保存。我想提示一个弹出窗口来保存

  • 问题内容: 我有一个通过node.js运行的JS文件,因此通常我会打开一个终端窗口并输入类似内容,然后它会整天运行;好玩 然后,当我想重新启动它时,我按下Ctrl-c,然后退出。然后,我可以再次运行命令。 现在,我想做的是能够通过网页执行此操作,以便我的用户可以运行特定的JS文件,也可以“重新引导”它们。 因此有两个问题: 有可能,如果可以,我如何开始? 它安全吗?如果不安全,可以安全吗? 基于s