HttpServletResponse对象代表服务器的响应,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。使用HttpServletResponse输出文件,浏览器会解析内容,完成下载。
核心代码如下:
public static void export(String fileContent, String downloadFile, HttpServletResponse response) throws Exception {
byte[] content = Base64Utils.decodeFromString(fileContent);
response.reset();
response.addHeader("Content-Disposition", "attachment;filename=" + new String(downloadFile.getBytes()));
response.addHeader("Content-Length", "" + content.length);
OutputStream ous = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream;charset=utf-8");
ous.write(content);
ous.flush();
ous.close();
}
- Content-Disposition
是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
格式说明: content-disposition = “Content-Disposition” “:” disposition-type *( “;” disposition-parm ) 。
属性名disposition-type是以什么方式下载,attachment为以附件方式下载disposition-parm为默认保存时的文件名。 - Content-Length
用于描述HTTP消息实体的传输长度the transfer-length of the message-body。在HTTP协议中,消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体的传输长度是gzip压缩后的长度。 - Content-Type
约定请求和响应的HTTP body内容编码类型,客户端和服务端根据HTTP头部字段Content-Type正确解码HTTP body内容。当响应的Content-Type为 application/octet- stream情况下使用了Content-Disposition为attachment的话,那就意味着你不想直接显示内容,而是弹出一个”文件下载”的对话框,接下来就是由你来决定“打开”还是“保存” 。
Content-Type种类非常多,具体请参考Http Content-Type对照表