Инициировать загрузку файлов с помощью Koa

Я использую Koa в качестве веб-сервера для обслуживания моего полимерного приложения. При нажатии кнопки в интерфейсе localhost:3000/export называется. Я хотел бы доставить файл-загрузку клиенту после упаковки некоторых файлов в zip-архив.

как это сделать в КОА.Яш?

вот пример, как это сделать в Express (другой вариант будет скачать-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')
})

3 ответов


вы должны быть в состоянии просто установить this.body в файловый поток

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

затем установите заголовки ответов соответствующим образом.

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

для тех, кто видит это в будущем, стоит упомянуть, что есть встроенный attachment метод response объект, который можно использовать для установки Content-Disposition to attachment С указанным именем. Таким образом, вы можете сделать это:

this.attachment('hello.txt')

и это будет то же самое, что и следующее:

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

Для Koa 2:

ctx.attachment('hello.txt')

поведение браузера по умолчанию-отображать файл, а не загружать его. Для принудительной загрузки вам нужно сделать следующее:

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