Sails.js中动态生成文件并直接发送的技术问题咨询
搞定Sails.js动态生成文件直接发送的需求
嘿,我明白你想不用存服务器,直接把动态生成的内容作为文件发给客户端的需求,你之前的问题主要是对res.attachment()的用法理解错啦,它可不是用来传文件内容的,我来给你捋清楚怎么弄:
问题出在哪?
你原来的代码里,res.attachment(data, 'fileName.txt')是错的——res.attachment()的参数只有可选的文件名,它的作用是告诉浏览器“把这个响应当成附件下载”,同时设置好对应的响应头,根本不接收文件内容。这就导致浏览器把你的data字符串当成了文件名,所以下载的文件叫"data",再加上你后面的res.send()没传内容,自然文件是空的。
正确的实现代码
只需要把res.attachment()和res.send()配合起来用就行,完全不用存文件:
function(req, res, next) { var name = req.param('name'); var data = 'Welcome Mr/Mrs ' + name; // 第一步:设置要下载的文件名,这会自动配置Content-Disposition响应头 res.attachment('fileName.txt'); // 第二步:设置内容类型(可选,但推荐明确指定,避免浏览器识别错误) res.set('Content-Type', 'text/plain'); // 第三步:把动态生成的内容发出去 res.send(data); }
另一种手动设置响应头的方式
如果你不想用res.attachment(),也可以手动写响应头,效果完全一样:
function(req, res, next) { var name = req.param('name'); var data = 'Welcome Mr/Mrs ' + name; res.set({ 'Content-Type': 'text/plain', // 直接指定附件和文件名,注意文件名的引号是规范要求 'Content-Disposition': 'attachment; filename="fileName.txt"' }); res.send(data); }
额外小提示
如果以后要生成其他格式的内容(比如CSV、JSON),只需要修改Content-Type就行:
- CSV用
text/csv - JSON用
application/json - 要是有非英文的字符,记得确保内容编码正确,必要时可以加
Content-Encoding: utf-8的响应头。
内容的提问来源于stack exchange,提问作者Ryan de Kock




