Content-Disposition 常见是用在 http 请求的 Response 的 Header 头部.

告诉请求客户端(浏览器) 如何处理内容;

Content-Disposition是在 MIME 标准定义的. http 中的用法只是其中的一小部分.

语法参数

inline

会在浏览器内部显示

1
Content-Disposition: inline

attachment

会被保存成文件

1
Content-Disposition: attachment

后面可以跟 filename, 值为预设文件名称, 中间使用;分号隔开.

1
Content-Disposition: attachment; filename="filename.jpg"

拓展参数, 有两个文件名称参数可选

  • filename*
  • filename

filename* 采用了 RFC 5987 中规定的编码方式, 假如两个参数都使用 filename* 的优先级更高

RFC 5987

该提议最终还是引用 RFC 2231 中的编码方式. 下面简单介绍一下语法

  • *星号用于标记该同名参数是支持该编码语法的, 就如( filename* 之于 filename)
  • '单个逗号用于分割 字符集名称 , 语言, 文件名称
  • %百分号用于标记编码方式, 参考RFC 2047, 所以文件名中不能有%
1
filename*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A

使用us-ascii编码, en-us英语

问题: 下载文件名称乱码

根据上面的知识, 就可以解决有的浏览器下载文件时中文名称乱码.

  • Http 返回设置Content-Disposition
  • 使用 RFC 2231 的文件名称方式, 制定编码utf-8
  • 将文件名称移除%
1
disposition := fmt.Sprintf("attachment;filename*=utf-8''%s", url.QueryEscape(name))

参考

MDN RFC 2231