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

Я использую 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')
})

person Hedge    schedule 02.11.2015    source источник


Ответы (4)


Вы должны иметь возможность просто установить this.body в файловый поток

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

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

this.set('Content-disposition', 'attachment; filename=' + filename);
this.set('Content-type', mimetype);
person James Moore    schedule 02.11.2015

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

this.attachment('hello.txt')

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

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

Для Коа 2:

ctx.attachment('hello.txt')
person Saad    schedule 17.01.2017

Браузер по умолчанию отображает файл, а не загружает его. Чтобы принудительно скачать, вам нужно сделать это:

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

Немного другого примера загрузки файла с проверкой ошибок с использованием Node с Koa 2. Я не уверен, что после этого необходимо уничтожить поток, как описано здесь 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

person leoncc    schedule 18.06.2019