【问题标题】:Uses of content-disposition in an HTTP response header在 HTTP 响应标头中使用 content-disposition
【发布时间】:2010-11-03 23:43:57
【问题描述】:

我发现以下 asp.net 代码在从数据库提供文件时非常有用:

Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);

这让用户可以将文件保存到他们的计算机上,然后决定如何使用它,而不是让浏览器尝试使用该文件。

使用 content-disposition 响应标头可以做哪些其他事情?

【问题讨论】:

  • 请注意,如果文件名包含空格或非 ASCII 字符,您的示例代码将会中断。有关详细信息,请参阅 RFC 6266。
  • @JulianReschke,被认为不可打印的 ASCII 字符怎么办? (00x1F
  • 阅读 RFC 6266(除了在文件名中使用它们是个坏主意;无论如何收件人都可能把它们扔掉)
  • 您可以使用空格、Unicode 等。如果您在名称周围使用双引号。 kb.mozillazine.org/…
  • @Ronnie Overby 什么是内容处置?

标签: http http-headers httpwebresponse httpresponse content-disposition


【解决方案1】:

嗯,看起来 Content-Disposition 标头最初是为电子邮件而不是 Web 创建的。 (Link to relevant RFC.)

我猜网络浏览器可能会响应

Response.AppendHeader("content-disposition", "inline; filename=" + fileName);

保存时,但我不确定。

【讨论】:

    【解决方案2】:

    请注意,RFC 6266 取代了下面引用的 RFC。 Section 7 概述了一些相关的安全问题。

    content-disposition 标头的权限是 RFC 1806RFC 2183. 人们还设计了 content-disposition hacking. 重要的是要注意 content-disposition 标头不是 HTTP 1.1 标准的一部分。

    HTTP 1.1 标准 (RFC 2616) 还提到了内容处置可能带来的安全副作用:

    15.5 内容处置问题

    RFC 1806 [35],其中经常 实施内容处置
    (参见第 19.5.1 节)HTTP 中的标头是 衍生,有很多非常
    严重的安全考虑。 内容处置不属于
    HTTP 标准,但由于它是 广泛实施,我们是
    记录其使用和风险 实施者。参见 RFC 2183 [49]
    (更新 RFC 1806)了解详情。

    【讨论】:

    • 现在,权威是 RFC 6266。
    • @JulianReschke,“取代”和“更新”如何工作?像 RFC 7230 这样的新版本是否也会使 RFC 6266 过时?
    • @Pacerier -- 为什么 RFC 7230 会影响 RFC 6266?
    • @Julian, 1) 由于 6266 更新了 2616,2) 2616 已被 723X 淘汰,3) 那么,6266 也算过时了吗?
    • 嗯,这里是 RFC 5678,那里是 RFC 9876。如果 Content-Disposition 不受欢迎,我们应该改用什么?
    【解决方案3】:

    此标头在RFC 2183 中定义,因此这是开始阅读的最佳位置。

    允许的值是在互联网号码分配机构 (IANA) 注册的值;他们的registry of values 应该被视为权威来源。

    【讨论】:

      【解决方案4】:

      请参阅 RFC 6266(超文本传输​​协议 (HTTP) 中 Content-Disposition 标头字段的使用)https://www.rfc-editor.org/rfc/rfc6266

      【讨论】:

        【解决方案5】:

        对于 asp.net 用户,.NET 框架提供了一个类来创建内容处置标头: System.Net.Mime.ContentDisposition

        基本用法:

        var cd = new System.Net.Mime.ContentDisposition();
        cd.FileName = "myFile.txt";
        cd.ModificationDate = DateTime.UtcNow;
        cd.Size = 100;
        Response.AppendHeader("content-disposition", cd.ToString());
        

        【讨论】:

        • 注意,这个类不符合RFC 6266。它在filename 参数中进行UTF-8 base64 编码,而不是使用filename* 参数和RFC 5987 编码。无法派生或使用 fx 工具来解决这个问题,几乎所有东西都是不可覆盖的或内部的…….Net fx 在学习开放性和可扩展性方面还有很长的路要走。在 MVC 5.2 中,FileResult 类对filename 的性能稍好一些,但不会像inline 那样处理其他参数,而且它的大部分实现也是内部的......
        猜你喜欢
        • 2018-10-30
        • 1970-01-01
        • 2013-02-10
        • 1970-01-01
        • 2017-10-10
        • 1970-01-01
        • 2021-07-20
        • 2011-02-02
        相关资源
        最近更新 更多