NodeJS 实现文件直接下载
在一些场景下,无论响应的内容是什么样的 MIME 值,需求中并不要求客户端去打开它,只需弹出并下载它即可。为了满足这种需求, Content-Disposition
字段应声登场。 Content-Disposition
字段影响的行为是客户端会根据它的值判断是应该将报文数据当做即时浏览的内容,还是可下载的附件。
当内容只需即时查看时,它的值为 inline
,当数据可以存为附件时,它的值为 attachment
。另外 Content-Disposition
字段还能通过参数指定保存时应该使用的文件名。
示例如下:
在线预览
res.setHeader('Content-Disposition', `inline; filename="1.js"`);
附件下载
res.setHeader('Content-Disposition', `attachment; filename="1.js"`);
如果我们要设计一个响应附件下载的 API(res.sendfile),我们的方法大致是如下这样的:
let http = require('http') let path = require('path') let fs = require('fs') let mime = require('mime') let server = http.createServer((req, res) => { let filepath = './download/1.js' fs.stat(filepath, function(err, stat) { if (err) { res.end('not found') } else { let stream = fs.createReadStream(filepath); res.setHeader('Content-Type', mime.getType(filepath)); res.setHeader('Content-Length', stat.size); let name = path.basename(filepath) res.setHeader('Content-Disposition', `attachment; filename="${name}"`); res.writeHead(200); stream.pipe(res); } }); }) server.listen(8080, () => { console.log('port start in 8080!') }) // path.basename('/foo/bar/baz/asdf/quux.html'); // 返回: 'quux.html'
为了方便获知文件的 MIME 值,社区有专有的 mime 模块可以用判段文件类型。它的调用十分简单
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论