一:介绍
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"
|
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 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(); }
|
*************感谢您的阅读*************