作者:fyupeng
技术专栏:☞ https://github.com/fyupeng
项目地址:☞ https://github.com/fyupeng/rpc-netty-framework
留给读者
一、介绍
文件下载在浏览器可以根据响应头设置纯下载和直接打开两种方式。
二、代码
@RequestMapping("/downloadPdf")
@ResponseBody
public void downloadSignPdf(HttpServletRequest request, HttpServletResponse response) {
OutputStream out = null;
try {
byte[] bytes = docService.downLoadPdf(gid, type, isHs);
if (bytes == null) {
// 构造错误信息的 JSON 格式字符串
String errorMsg = "{\"msg\": \"文件不存在\", \"gid\": \""+gid+"\", \"type\": \""+type+"\", \"isHs\": \""+isHs+"\" }";
// 设置响应的 Content-Type 和字符编码
response.setContentType("application/json;charset=UTF-8");
// 将错误信息写入响应输出流
PrintWriter pw = response.getWriter();
pw.print(errorMsg);
pw.flush();
return;
}
response.reset(); // 非常重要
// 纯下载方式
//response.setContentType("text/html; charset=UTF-8");
//response.setHeader("Content-Disposition", "attachment;fileName=" + gid + ".pdf");
// 直接打开
response.setContentType("application/pdf"); // 设置返回的文件类型
response.addHeader("Content-Length", String.valueOf(bytes.length)); //文件大小
out = response.getOutputStream();
out.write(bytes);
out.flush();
} catch (Exception e) {
e.printStackTrace();
logger.error("下载电子签名后的pdf失败,gid={}, type={}, isHs={}", gid, type, isHs);
} finally {
if (out != null) {
try {
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
三、总结
简洁、高效、易用!