【问题标题】:I want to download a zip file in MEAN stack我想在 MEAN 堆栈中下载一个 zip 文件
【发布时间】:2020-08-10 11:48:20
【问题描述】:

这是前端代码(Angular):-

  download(user) {


    this.clientAPI.get(Endpoints.DOWNLOAD).toPromise()
      .then(res => {
      
        let blob = new Blob([new Uint8Array(res.file)], { type: 'application/zip' });
          console.log('blob',blob);
        let a = document.createElement('a');
        a.href = (URL.createObjectURL(blob));
        a.download = res.filename;
        document.body.appendChild(a);
        a.click();
         a.remove();
        //  this.downloadComplete(user);
      })
      .catch(err => console.error("download error = ", err))
  }

Here is my backend code (Node Js):-

exports.download = function (req, res) {

  let file = process.env.NOCE_ENV === 'local' ? `${process.cwd()}/server/downloads/eFAST-Release-20.5.17.19.zip` :
    `${process.cwd()}/server/downloads/eFAST-Release-20.5.17.19.zip`;
  let filename = path.basename(file);
  res.setHeader('Content-disposition', 'attachment; filename=' + filename);
  res.setHeader('Content-type', "application/zip");
  let filestream = fs.createReadStream(file);
  
 // console.log('filestream',filenter code hereestream)
  res.jsonp({ filename: filename, file: filestream });
};

我可以下载该文件,但不是 zip 格式。即 .txt 格式和零字节。

请看一下,让我知道 hpw 我可以这样做吗?

【问题讨论】:

  • 您是否尝试在客户端解压缩下载的 zip 文件?在 npm 上有 zip.js 等库。
  • 我只是想下载 zip 文件

标签: node.js angular express mean-stack


【解决方案1】:

你可以在 express 中使用 res.download("link_to_file") 来下载它。

更多信息here.

我使用 res.download 但我如何以角度管理它?

我不确定 Angular,但我认为您可以在此处使用纯 js 导航到将开始下载的新标签。

window.open('https://YOUR-LINK-TO-FILE/download','_blank')

顺便说一句,你有错字:process.env.NOCE_ENV

【讨论】:

  • 我使用了 res.download 但我怎么能以角度管理这个?
  • 但我不想使用 window.open
  • @Deepikavijay 好的,我没有为此使用 angular,但对于 React,我使用了 npm 包来启动页面上的“保存文件”对话框。所以你可以尝试找到类似npmjs.com/package/angular-file-saver 的东西或者查看他们的源代码来自己实现它
  • @Deepikavijay 我认为您可以像 <a ng-href="{{linkToFile}}" target="_self"></a> 那样放置指向文件的链接而不是 window.open,然后将 express 与 res.download 一起使用
  • 我正在尝试通过这个下载(用户){ this.clientAPI.get(Endpoints.DOWNLOAD).toPromise() .then(res => { let a = document.createElement('a') ; a.href = (URL.createObjectURL(res)); a.download = 'test'; document.body.appendChild(a); a.click(); a.remove(); });并在后端 export.download = function (req, res) { let file = process.env.NOCE_ENV === 'local' ? ${process.cwd()}/server/downloads/eFAST-Release-20.5.17.19.zip${process.cwd()}/server/downloads/eFAST-Release-20.5.17.19.zip; res.download(文件); };
【解决方案2】:

您需要将文件流(来自fs.createReadStream())通过管道传输到res(响应)。如果您阅读有关streamhttp 的nodejs 文档,您会注意到res 实际上也是一个Writable 流,您可以将其管道 插入如下:

// set status code
res.setStatus(200); // 200 means ok
// set headers beforehand
// octet-stream means binary
res.setHeader('content-type', 'application/octet-stream');
filestream.pipe(res);

流是 NodeJS 强大和高效的原因。它是一个基于事件的发射器,通过可配置的highWaterMark 属性(我认为每个块 16KB)以阈值限制传递数据块。您通常将Readable 管道Writable 流中(在您的情况下,一个可读文件流到一个可写http 响应流中)。你可以在这里阅读更多关于它们的信息:https://nodejs.org/api/stream.html

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 2017-09-20
    • 2015-01-02
    • 2015-11-16
    • 2019-08-13
    • 1970-01-01
    • 2014-02-06
    • 2017-11-06
    相关资源
    最近更新 更多