首先页面的下载代码如下:
<a href="javascript:void(0);" style="font-size:14px;cursor:pointer;color:red" onclick="downDatasourceFile(${detailId})">《数据授权申请-数据源-需求编号:${detailId}》
</a>
页面定义了a标签,通过onclick事件来实现文件的下载行为。
下面是onclick事件的内容:
function downDatasourceFile(detailId, flag){
window.location.href = "/DataSourceController/getDatasourceTemplate?detailId=" + detailId;
}
点击事件实现跳转到controller中进行处理,而controller的内容如下:
/**
*生成源数据库权限申请模板文件
* @param request
* @param response
* @return excel文件
* @throws UnsupportedEncodingException
*/
@RequestMapping("getDatasourceTemplate")
public String getDatasourceTemplate(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
//获取需求ID
String detailId = request.getParameter("detailId");
String fileName = "";
if (StringUtils.isNotBlank(detailId)) {
List<DatabaseInfo> dbs = null;
OutputStream os = null;
List<Integer> tableIds = new ArrayList<Integer>();
List<TableInfo> tableInfos = tableInfoService.selectByDetailId(detailId);
for (TableInfo tableInfo : tableInfos) {
tableIds.add(tableInfo.getId());
}
dbs = databaseInfoService.getDatabaseInfosByTableIds(tableIds);
fileName = "数据授权申请-数据源-需求编号:" + detailId + ".xls";
HSSFWorkbook wb = DatasourceTemplate.getTemplateFile(dbs);
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("gbk"), "iso-8859-1"));
response.setHeader("Content-type", "charset=UTF-8");
try {
os = response.getOutputStream();
wb.write(os);
os.close();
os.flush();
os.close();
response.flushBuffer();
} catch (Exception e) {
}
}
return null;
}
一般如果采用a标签的herf方式链接文件从而下载文件,是需要先生成文件的,要么存在工程里,要么存在服务器上。不论是哪种方式都复杂了些,并且耗时。如果文件不是一成不变的,是由网页上其他内容所决定的,并且要实时的生成,还不想用文件服务器什么的,那这个方法一定适合你。
controller中:
HSSFWorkbook wb = DatasourceTemplate.getTemplateFile(dbs);
是生成的Excel文件的工具类生成的一个HSSFWorkbook 对象,由response输出流写出到页面上展示。
下面的代码是因为文件名中有中文,这样设置一下,可以让中文正常显示。
new String(fileName.getBytes("gbk"), "iso-8859-1")
整个实现,最重要的就是给response设置的那几个参数。
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" +filename));
response.setHeader("Content-type", "charset=UTF-8");