(1)HTTP 协议可以在客户端和服务器之间传递任何类型的文件。
HTTP协议下载文档到客户端时候, 必须通过响应头Content-Type设置文件类型。
例如:
contentType=text/html
contentType=image/png
contentType=audio/mpeg
(2)如果需要指定下载名,可以通过响应头 Content-Disposition=attachment;filename="demo.xls"设置下载的文件名,写法如下:
response.setHeader("Content-Disposition", "attachment;filename="+fileName+".xls"); 指支持英文
如需设置中中文名,要进行中文转码。String fileName = java.net.URLEncoder.encode("泓凯账单信息", "UTF-8");
(3)Spring MVC 的控制器下载支持
@ResponseBody 注解不仅仅能够处理 JSON 数据, 可以自动处理其他数据:
- 如果返回值是一个JavaBean对象,就序列化JSON字符串反馈到浏览器
- 如果是byte[], 就将byte[] 数据填充到Response Body中发送到浏览器, 这时需要与 @RequestMapping配合
(4)案例一:动态生成png图片
//produces="image/png" 用于指示响应头中要包含Content-Type=image/png
@RequestMapping(value = "/png.do", produces = "image/png")
@ResponseBody
public byte[] demo() throws IOException {
BufferedImage img = new BufferedImage(100, 30, BufferedImage.TYPE_3BYTE_BGR);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(img, "png", out);
byte[] data = out.toByteArray();
out.close();
return data;
}
案例二:导出Excel文件
//动态生成 Excel 文件: //excel的文件contentType格式
@RequestMapping(value="excel.do",produces="application/vnd.ms-excel")
@ResponseBody
public byte[] excel(
HttpServletResponse response)
throws IOException{ //指定下载时候的文件名
response.setHeader(
"Content-Disposition",
"attachment;filename=\"demo.xls\""); HSSFWorkbook book=new HSSFWorkbook();
HSSFSheet sheet = book.createSheet(
"出勤");
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue("Hello World!"); ByteArrayOutputStream out =
new ByteArrayOutputStream();
book.write(out);
out.close();
byte[] data = out.toByteArray();
return data;
}