前言:
当拿到需求的时候,我首先想要的就是用万能的ajax进行传输,没想到ajax也不是万能的,?
原因:ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的接收类型只能是string字符串,不是流类型,所以无法实现文件下载。
一、前端如何接收文件流
我使用的前端接收文件流的方式很简单,直接使用window.location.href 加 文件URL即可。
function finStatementExcelExport(){
window.location.href = "${base.contextPath}/fnd/fin/statement/excelexport?bpId="+bpId;
}
二、后端如何传送文件流
后端使用POI接口生成excel文件,然后将其写入文件流。
@RequestMapping(value="/fnd/fin/statement/excelexport")
@ResponseBody
public ResponseData finStatementLnExcelExport(HlsCusFinStatementHd finStatementHd,HttpServletResponse response){
response.reset(); // 清除buffer缓存
try {
String fileName = "商业伙伴财务报表.xls";
response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));//设置文件名
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
HSSFWorkbook wb = new HSSFWorkbook();
//查询财报模板头表
List<HlsCusFinStatementHd> finStatementHdList=hlsCusFinStatementHdService.finStatementHdQuery(finStatementHd);
createSheetByLineType(wb,"BALANCE_SHEET",finStatementHdList);
createSheetByLineType(wb,"PROFIT_STATEMENT",finStatementHdList);
createSheetByLineType(wb,"CASH_FLOW_STATEMENT",finStatementHdList);
createSheetByLineType(wb,"FINANCIAL_INDEX",finStatementHdList);
OutputStream output;
try {
output = response.getOutputStream();
BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
bufferedOutPut.flush();
wb.write(bufferedOutPut);
bufferedOutPut.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
三、response.setHeader()设置下载中文文件名乱码问题
上图中的代码已经解决了中文文件名乱码问题,关键代码如下图所示,下文链接中给出了两种方法,选择其中任意一种即可。
参考:解决Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name) 中文显示乱码
response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));//设置文件名