Initiate file download with Koa

Hedge picture Hedge · Nov 2, 2015 · Viewed 13.3k times · Source

I'm using Koa as a webserver to serve my Polymer application. Upon pressing a button in the frontend localhost:3000/export is called. I would like to deliver a file-download to the client after packing the some files to a zip-archive.

How to do this in Koa.js?

Here's an example on how to do it in Express (another option would be the 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);
});

I'm looking for something like this:

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

Answer

James Moore picture James Moore · Nov 2, 2015

You should be able to simple set this.body to the file stream

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

then set the response headers as appropriate.

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