使用 Koa 启动文件下载
Initiate file download with 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')
})
您应该能够简单地将 this.body
设置为文件流
this.body = fs.createReadStream(__dirname + '/test.zip');
然后根据需要设置响应 headers。
this.set('Content-disposition', 'attachment; filename=' + filename);
this.set('Content-type', mimetype);
对于以后看到此内容的任何其他人,值得一提的是 response
对象上有一个内置的 attachment
方法,您可以使用它来设置 Content-Disposition
到 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);
使用 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
我正在使用 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')
})
您应该能够简单地将 this.body
设置为文件流
this.body = fs.createReadStream(__dirname + '/test.zip');
然后根据需要设置响应 headers。
this.set('Content-disposition', 'attachment; filename=' + filename);
this.set('Content-type', mimetype);
对于以后看到此内容的任何其他人,值得一提的是 response
对象上有一个内置的 attachment
方法,您可以使用它来设置 Content-Disposition
到 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);
使用 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