【问题标题】:http download file namehttp下载文件名
【发布时间】:2012-11-09 11:45:23
【问题描述】:

我可以知道如何为 a-href 文件下载分配文件名。

<a href="http://localhost:8080/couch/getFile?dbName=xxx&file=test.xml">get-file</a>

右键另存为:后台运行的服务会返回test.xml内容,用户可以在本地保存。但是这里每次用户都需要输入一个文件名来保存。相反,我想拉 test.xml。我可以知道如何告诉浏览器使用“test.xml”作为下载文件名吗?

在 HTTP 响应上设置标头会起作用吗?如果是这样,我可以知道我们该怎么做吗?

【问题讨论】:

    标签: http


    【解决方案1】:

    您需要附加 HTTP 响应标头“Content-Disposition”

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

    【讨论】:

    • 请注意,IE 似乎将单引号视为文件名的一部分。
    • 单引号对文件名无效。见quoted-string
    • 我替换了单引号。
    • 如果 filename 包含引号或反斜杠(在 UNIX 上允许),这将中断,因为需要转义。
    • 不能使用引号对(转义),因为它会破坏现有软件。相反,将 " 转义为 %22 并将反斜杠保留为 \,因为这是所有现有软件都遵循的事实标准。例如,如果您上传一个名为 foo"bar\ 的文件,浏览器会发送 filename="foo%22bar\"(经过测试2019 年在 Mac 上使用 Firefox 和 Chrome)。如果您尝试遵循 RFC 并将 \" 视为转义序列,则解析失败。
    【解决方案2】:

    HTTP 标头Content-Disposition 允许您建议文件名。

    Content-Disposition 响应头字段 […] 可用于附加 附加元数据,例如保存文件时使用的文件名 本地响应负载。

    如果您查看BNF,您会看到文件名被指定为quoted-string

    quoted-string = ( *(qdtext |quoted-pair ) )

    这是一个有效的例子:

    Content-Disposition: attachment; filename="fname.ext"
    

    请注意,单引号' 无效。如果您需要在文件名中包含引号 ("),您可以使用 ".不过RFC-6266 suggests to avoid including quotes:

    避免在带引号的字符串形式中包含“”字符 文件名参数,因为某些用户没有实现转义 代理,“”可以被认为是非法路径字符。

    【讨论】:

    • 对于带引号的字符串,如何转义文件名中的引号?
    • quoted-pair 是 "\" CHAR,而 CHAR 包含 ". 所以 \" 会这样做。 RFC 也在其 BNF 中说:反斜杠字符 ("\") 只能在quoted-string 中用作单字符引用机制
    • 更新的RFC-6266建议:避免在文件名参数的引号字符串形式中包含“\”字符,因为一些用户代理没有实现转义,可以考虑“\”非法路径字符。
    • 如果您不希望浏览器强制下载,这是我理解的 OP 要求的,然后使用“内联”而不是“附件”Content-Disposition: inline; filename="fname.ext"
    【解决方案3】:

    在现代浏览器中,您还可以在链接标签上使用下载属性:

    <a href="http://localhost:8080/couch/getFile?dbName=xxx&file=test.xml" download="test.xml">
        get-file
    </a>
    

    你可以在Can I use查看它的支持

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 2017-10-16
      • 2011-12-07
      • 2010-12-20
      • 2013-10-31
      • 2019-01-02
      • 2023-03-31
      • 2010-09-28
      • 2020-12-26
      相关资源
      最近更新 更多