关于文件下载
2016-01-05 本文已影响0人
殇别云之
引言
由于项目需要,需要实现对特定Excel模板数据的导入操作,而模板需要由开发人员设计,而模板需要对各种数据做校验,取特定值等限制,所以下载模板的方式就使用了文件下载的方式来实现。
实现
项目使用 JFinal搭建,在JSP客户端使用 js直接跳转的方式请求服务链接
window.location.href=$("#basePath").val() + "/mission/template/download/" + $("#templateType").val();
而在后台,我们将制作好的模板放置到 src/main/resources目录下
Paste_Image.png
接下来只需要将文件转换为workbook。
String completeFilePath = MissionController.class.getClassLoader().getResource("/").getPath() + Constants.DEFAULT_TEMPLATE_FOLDER + fileName;
Workbook workbook = WorkbookFactory.create(new File(completeFilePath));
JFinal支持可按照自己的render方式来渲染请求结果,针对excel文件下载,我们继承了Render类,并重写 render方法
@Override
public void render() {
OutputStream os = null;
try {
response.reset();
final String userAgent = request.getHeader("USER-AGENT");
if(StringUtils.contains(userAgent, "MSIE")||StringUtils.contains(userAgent, "Trident")){//IE浏览器
fileName = URLEncoder.encode(fileName,"UTF8");
}else if(StringUtils.contains(userAgent, "Mozilla")){//google,火狐浏览器
fileName = new String(fileName.getBytes("utf-8"), "ISO8859-1");
}else{
fileName = URLEncoder.encode(fileName,"UTF8");//其他浏览器
}
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
response.setContentType("application/vnd.ms-excel;charset=utf-8;");
os = response.getOutputStream();
workbook.write(os);
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if(os != null){
os.flush();
os.close();
}
} catch (IOException e) {
throw new RenderException(e);
}
}
}
这个方法主要说明一点:这里为兼容各种浏览器的下载(若未对fileName做处理,IE下会出现中文名称乱码问题),对各种浏览器下我们对fileName进行编码处理。而下载方式主要取得response的输出流,并将workbook写入到输出流即可。
最后,在Controller层的最后,渲染render实体对象即可