Инициировать загрузку файлов с помощью 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);