老鬼的博客 来都来啦,那就随便看看吧~
HTTP Content-Disposition
发布于: 2019-10-09 更新于: 2019-10-09 分类于:  阅读次数: 

一:介绍

1
2
3
4
5
在常规 HTTP 响应中,Content-Disposition响应标头是指示内容是否预期在浏览器中内联显示的标题,
即,作为网页或作为网页的一部分或作为附件下载并且本地保存。
在一个multipart/form-data正文中,HTTP Content-Disposition通用标题是一个标题,可以在多部分
主体的子部分中使用,以提供有关它适用的字段的信息。子部分由标题中定义的边界分隔Content-Type。
用于身体本身,Content-Disposition没有任何作用。

二:作为主体的响应标题

  • 描述
1
2
HTTP 上下文中的第一个参数是inline(默认值,表示它可以显示在网页内,或作为网页)或
attachment(表示它应该下载;大多数浏览器呈现“另存为”对话框,预先填入filename如果存在参数的值
  • 例子
1
2
3
Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"

三:作为多部分主体的 header

  • 描述
1
2
HTTP 上下文中的第一个参数总是form-data; 其他参数不区分大小写,并且有参数,
在'='符号后面使用带引号的字符串语法。多个参数用分号(';')分隔。
  • 例子
1
2
3
Content-Disposition: form-data
Content-Disposition: form-data; name="fieldName"
Content-Disposition: form-data; name="fieldName"; filename="filename.jpg"

四:指令

1
2
3
4
5
6
7
name : 后面跟着一个字符串,其中包含该字段的内容引用的 HTML 字段的名称。在同一字段中处理多个文件(例如元素的multiple属性<input type=file>)时,可能会有几个具有相同名称的子部分。

一个name有值'_charset_'表明该部分不是 HTML 区域,但默认字符集,而无需显式的字符集信息使用的部分。

filename : 后面是一个包含传输文件的原始名称的字符串。文件名始终是可选的,不能被应用程序盲目使用:路径信息应该被删除,并且应该转换为服务器文件系统规则。该参数提供大部分指示性信息。当与其结合使用时Content-Disposition: attachment,它被用作提供给 user.filename 的最终“另存为”对话框的默认文件名*

参数“filename”和“filename *”的区别仅在于“filename *”使用RFC 5987中定义的编码。当“文件名”和“文件名*”都出现在单个标题字段值中时,“文件名*”优于“文件名”,当两者都存在并被理解时。

五:例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
触发“另存为”对话框的响应:

200 OK
Content-Type: text/html; charset=utf-8
Content-Disposition: attachment; filename="cool.html"
Content-Length: 22

<HTML>Save me!</HTML>

这个简单的 HTML 文件将被保存为常规下载而不是在浏览器中显示。大多数浏览器会建议将其保存在cool.html文件名下(默认情况下)。

HTML 表单的一个示例,使用multipart/form-data使用Content-Disposition标题的格式发布:

POST /test.html HTTP/1.1
Host: example.org
Content-Type: multipart/form-data;boundary="boundary"

--boundary
Content-Disposition: form-data; name="field1"

value1
--boundary
Content-Disposition: form-data; name="field2"; filename="example.txt"

value2
--boundary--

六:java例子

  • 介绍
1
nutz框架返回二进制
  • 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @desc 预览附件
* @param id
*/
@At("/view-files")
@Ok("raw")
public byte[] viewFiles(String id,HttpServletResponse resp) {

SpAssert.isNotEmpty(id, "id is null");
Files fileRecord = filesService.loadFiles(id);
SpAssert.isNotNull(fileRecord, "数据不存在!");
if(StringUtils.isNotEmpty(fileRecord.getName())) {
try {
String filename = URLEncoder.encode(fileRecord.getName(), "UTF-8");
resp.addHeader("Content-Disposition", "inline;filename=" + new String(filename.getBytes(),"utf-8"));
resp.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
resp.setContentType(fileRecord.getContentType());
return fileRecord.getContent();
}
*************感谢您的阅读*************