function downloadOrderExport(){
var row=$("#dataTable").datagrid('getSelected');
if(row !=null){
var filepath=escape(encodeURIComponent(row.filePath));
window.location.href=basePath+"/orderExport/downloadAndUpdate?filePath="+filePath;
}else{
$.messager.alert('提示','请选择一条你要下载的记录!');
}
}
@RequestMapping("/download")
public void downloadXmlFile(HttpServletRequest request,HttpServletResponse response){
String filePath=request.getParameter("filePath");
//为防止文件名乱码,这里进行处理
try {
filePath=URLDecoder.decode(filePath,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
File file=new File(filePath);
String fileName=file.getName();
try{
InputStream fis=new BufferedInputStream(new FileInputStream(filePath));
byte[] buffer=new byte[fis.available()];
fis.read(buffer);
fis.close();
//清空response
response.reset();
//设置response的Header
response.setHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes()))
response.setHeader("Content-length",""+file.length());
OutputStream toClient=new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
}catch(Exception e){
logger.error("文件下载出错。"+e.getMessage(),e);
//文件不存在时会在FileinputStream(filePath)读取时异常,进入这里。导致前台页面无响应。这里就进行重定向到原页面,并带上错误标记
try{
//request.getCOntextPath()获取项目名,这个必须加上,不然找不到对应path的方法。页面404,这个path对应本类的另一个方法(在下面有)
response.sendRedirect(request.getCOntextPath()+"/orderExport/toOrderExport?error=error");
}catch(IOException e1){
logger.error(e1);
}
}
}
//转跳到下载的主页面
@RequestMapping("/toOrderExport")
public String jumpToOrderExportJsp(){
return "/orderExport/orderExportIndex";
}
3.经过前两步,如果要下载的文件有异常,就会进入异常处理模块—通过response请求转发到前台下载页面。但是问题来了:我们是通过window.location.href进行后台。并没有回调函数的功能,该如何接收后台的入参呢?答案是在页面每次加载时进行异常标记的判断!js代码如下:
$(function(){
function getQueryString(param){
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null){
$.messager.alert('提示','你下载的文件不存在!');
}
}
getQueryString("error");
})