【问题标题】:Is it acceptable to set 'Content-disposition' without 'Content-Length'?在没有“Content-Length”的情况下设置“Content-disposition”是否可以接受?
【发布时间】:2014-07-29 03:49:28
【问题描述】:

我有一个简单的 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 的情况下工作。)

【问题讨论】:

  • 要计算字符串的字节长度,请使用:Buffer.byteLength(sData, [sEncoding])sEndcoding 默认为 utf-8。

标签: javascript node.js http express


【解决方案1】:

Content-Length 和 Content-Disposition 是正交的。

如果您不发送 Content-Length,则必须使用 Transfer-Encoding 分块。 (通常,您的 HTTP 库会为您执行此操作)

【讨论】:

    【解决方案2】:

    这不是必需的,只需设置Content-Disposition 就可以了。例如,RFC2616RFC6266 中没有任何内容需要您将它们组合在一起。

    如果需要,我将如何从 csv 变量(它是一个 JavaScript 字符串)计算大小值?

    不是,但这并不意味着包含它不好。 :-) 我没有用 NodeJS 做到这一点,但我会说将其转换为具有适当编码的缓冲区(例如,您在 charset 中包含的编码)并以字节为单位获取缓冲区的大小。既然你要将该缓冲区作为内容发送,并且缓冲区会告诉你它有多大,那应该是准确的。

    【讨论】:

    • 我猜如果没有Content-Length,浏览器将无法提供下载进度(百分比),所以为大文件设置它是有意义的。
    • 是的。如果您可以提供,那就太好了。我已经添加了一个关于此的想法的注释。
    • 啊顺便说一句,RFC 2616 刚刚被一堆其他规范所取代 :) mnot.net/blog/2014/06/07/rfc2616_is_dead
    • 有趣!在这里,我特别指出它是否说它已被取代。 :-)(它没有,在上面的那个链接中......)看起来有一个专门针对Content-Disposition的RFC,不过,截至2011年;我已经在上面链接了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多