我有一个简单的Express.js路线:
app.get('/db/csv', function (req, res) {
db.users.find({}, { _id: 0 }, function (err, docs) {
var csv = /* compute from docs */;
res.setHeader('Content-disposition', 'attachment; filename=users.csv');
res.send(csv);
});
});
我使用此路线下载我的“用户”数据库的CSV版本。设置Content-disposition
HTTP响应标头将在浏览器中触发“另存为...”对话框。
我还应该设置Content-Length
标头吗?我在一个例子中看过它,我不确定这里是否需要它。如果需要,我如何从csv
变量(这是一个JavaScript字符串)计算大小值?
(顺便说一下,浏览器中的功能没有Content-Length
。)
答案 0 :(得分:4)
不需要,只设置Content-Disposition
就可以了。例如,RFC2616或RFC6266中没有任何内容要求您合并它们。
如果需要,我如何从csv变量(这是一个JavaScript字符串)计算大小值?
不是,但这并不意味着包含它并不好。 :-)我还没有使用NodeJS做到这一点,但是我说要将其转换为具有适当编码的缓冲区(例如,您在charset
中包含的编码)并获取缓冲区的大小(以字节为单位)。既然你要将该缓冲区作为内容发送,而缓冲区告诉你它有多大,那就应该是准确的。
答案 1 :(得分:1)
Content-Length和Content-Disposition是正交的。
如果您不发送Content-Length,则必须使用分块传输编码。 (通常,您的HTTP库将为您执行此操作)