【问题标题】:Initiate file download with Koa使用 Koa 启动文件下载
【发布时间】:2016-02-02 15:15:17
【问题描述】:

我使用 Koa 作为网络服务器来为我的 Polymer 应用程序提供服务。按下前端中的按钮时会调用localhost:3000/export。在将一些文件打包到 zip 存档后,我想向客户端提供文件下载。

如何在 Koa.js 中做到这一点?

这是一个关于如何在 Express 中执行此操作的示例(另一个选项是 download-helper

app.get('/export', function(req, res){

  var path = require('path');
  var mime = require('mime');

  var file = __dirname + '/upload-folder/dramaticpenguin.MOV';

  var filename = path.basename(file);
  var mimetype = mime.lookup(file);

  res.setHeader('Content-disposition', 'attachment; filename=' + filename);
  res.setHeader('Content-type', mimetype);

  var filestream = fs.createReadStream(file);
  filestream.pipe(res);
});

我正在寻找这样的东西:

router.post('/export', function*(){
  yield download(this, __dirname + '/test.zip')
})

【问题讨论】:

    标签: node.js download koa


    【解决方案1】:

    您应该能够简单地将this.body 设置为文件流

    this.body = fs.createReadStream(__dirname + '/test.zip');
    

    然后根据需要设置响应头。

    this.set('Content-disposition', 'attachment; filename=' + filename);
    this.set('Content-type', mimetype);
    

    【讨论】:

      【解决方案2】:

      对于将来看到此内容的其他人,值得一提的是,response 对象上有一个内置的attachment 方法,您可以使用该方法将Content-Disposition 设置为具有指定文件名的attachment .所以你可以这样做:

      this.attachment('hello.txt')
      

      这将与以下内容相同:

      this.set('Content-disposition', 'attachment; filename=hello.txt')
      

      对于 Koa 2:

      ctx.attachment('hello.txt')
      

      【讨论】:

        【解决方案3】:

        浏览器默认行为是显示文件,而不是下载文件。要强制下载,您需要这样做:

        this.header("Content-Type", "application/force-download")
        this.header('Content-disposition', 'attachment; filename=' + filename);
        

        【讨论】:

          【解决方案4】:

          带有错误检查的不同文件下载示例的位,使用带有 Koa 2 的 Node。我不确定之后是否有必要按照此处所述 https://github.com/jshttp/content-disposition#options 销毁流

          router.get('/downloads/:version/:file', async function(ctx) {
            const fileName = `${__dirname}/downloads/${ctx.params.version}/${ctx.params.file}`;
            try {
              if (fs.existsSync(fileName)) {
                ctx.body = fs.createReadStream(fileName);
                ctx.attachment(fileName);
              } else {
                ctx.throw(400, "Requested file not found on server");
              }
            } catch(error) {
              ctx.throw(500, error);
            }  
          });
          

          在浏览器示例中:https://myserver.com/downloads/1.0.0/CoolAppFile.zip

          【讨论】:

            猜你喜欢
            • 2018-03-07
            • 2015-09-06
            • 2014-12-02
            • 2013-03-15
            • 1970-01-01
            • 2011-04-08
            • 1970-01-01
            • 2020-07-09
            • 1970-01-01
            相关资源
            最近更新 更多