在AJAX中发请求下载文件,当文件不存在时出现的问题

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 在AJAX中发请求下载文件,当文件不存在时出现的问题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

问题描述:
用AJAX的post请求实现一个下载功能,当所要下载的文件不存在时,前台返回页面无响应,部分代码如下:
前台:
在这里插入图片描述
Controller:
在这里插入图片描述
(Controller中130行处file路径下的文件不存在,所以程序会跳到149行的catch方法中,并给前台返回一个下载失败的信息)
前台界面在浏览器中的显示:
在这里插入图片描述
我们可以看到前台界面没有接收到后台传来的信息。

问题产生原因:
去网上查阅了一些相应资料,产生这个问题的原因是下载请求不可以放在AJAX中

解决办法:
在前台先用ajax发请求去判断文件是否存在,如果不存在,则给出相应的提示,如果存在则执行后面请求中的下载操作,部分修改代码如下:
前台:

function downXbrl(type){
	var rows = $('#dg').datagrid('getSelections');
	if(rows.length!=1){$.messager.alert('消息提示','请选择一个要生成报送文件的单号!','error');return ;}
	var flag = false;
	$.ajax({  
        type: "post",  
        url: "${pageContext.request.contextPath}/TxReportInfo/checkDownXbrl.do",  
        data: {"reportId": rows[0].reportId,"reportType": rows[0].reportType,"type": type},  
        async: false,  
        success: function(result){  
        	if (result.success){
    			flag = true;
    		}else{
    			jsutil.msg.alert(result.errorMsg);			
    		} 
         }  
    });
	if(flag){	
		location.href = '${pageContext.request.contextPath}/TxReportInfo/downXbrl.do?reportId='+rows[0].reportId+"&reportType="+rows[0].reportType+"&type="+type;
	}
	
}

Controller:

@RequestMapping(path="/downXbrl")
	
	public  void   downLoad(HttpServletRequest request,HttpServletResponse response,TxReportInfoDTO dto) throws IOException{
    	String path = Config.getProperty("uploaddir")+Config.getProperty("downloaddir");
    	String xmlName = "";
		if("0".equals(dto.getType())){
           xmlName = "_q";
        }else if("1".equals(dto.getType())){
            xmlName = "_new";
         }else if("2".equals(dto.getType())){
           xmlName = "_old";
        }else{
        	System.out.println("Type类型为空!");
        }
		String file = path + dto.getReportId() + xmlName + ".xml";
    	String fileName = file.substring(file.lastIndexOf("/") + 1, file.length());
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
	    try {
	    	response.setContentType("application/octet-stream");	
			response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
			
			bis = new BufferedInputStream(new FileInputStream(file));
			bos = new BufferedOutputStream(response.getOutputStream());
			byte[] by=new byte[2048];
			int bytesRead;
			while(-1 != (bytesRead = bis.read(by,0,by.length))){
				bos.write(by, 0, bytesRead);
			}
			bis.close();
			bos.flush();	
			bos.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally { 
			bis.close();  
			bos.close();  
	    }
    }
	@RequestMapping(path="/checkDownXbrl")
	@ResponseBody
	public InvokeResult checkdownload(TxReportInfoDTO dto){
		String path = Config.getProperty("uploaddir")+Config.getProperty("downloaddir");
		String xmlName = "";
		if("0".equals(dto.getType())){
           xmlName = "_q";
        }else if("1".equals(dto.getType())){
            xmlName = "_new";
         }else if("2".equals(dto.getType())){
           xmlName = "_old";
        }else{
        	System.out.println("Type类型为空!");
        }
		String file = path + dto.getReportId() + xmlName + ".xml";
		File checkFile = new File(file);
		if(!checkFile.exists()){
			return InvokeResult.failure("请先生成报送文件!");
		}
		return InvokeResult.success();
	}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131311.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!