使用Koa启动文件下载

时间:2015-11-02 16:46:21

标签: node.js download koa

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

如何在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')
})

4 个答案:

答案 0 :(得分:22)

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

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

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

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

答案 1 :(得分:15)

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

attachment

这与以下内容相同:

this.attachment('hello.txt')

对于Koa 2:

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

答案 2 :(得分:1)

浏览器默认行为是显示文件,而不是下载文件。要强制下载,您需要执行以下操作:

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

答案 3 :(得分:0)

使用带有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