struts 如何实现下载错误 信息提示

铂金苍鹰 发布于 2011/08/31 10:08
阅读 683
收藏 0

网页上下载出错的提示框都是有哪些实现方式的呢?

因为项目所有页面的上传和下载都公用了一个action,所以如果当下载出错(比如文件被删除,不存在)跳转到新的页面的话,”返回“就比较难实现;

 

以下是问题补充:

@铂金苍鹰:ShowMessage.print(request, response, "文件不存在!"); 函数 是实现页面弹出alert();但是在这个现在这个方法里面并没有能弹出,而是弹出了下载保存文件的窗口 (2011/08/31 11:21)
加载中
0
铂金苍鹰
铂金苍鹰
	public ActionForward download(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws ModuleException {
		ProjectinfoFileForm fileForm = (ProjectinfoFileForm) form;
		ProjectinfoFile file=new  ProjectinfoFile();

		String fileName=fileForm.getId().substring(fileForm.getId().lastIndexOf("/")+1,fileForm.getId().length());
		
		System.out.println(fileName);
		         
		try {

			response.setContentType("application/x-msdownload");
			response.setHeader("Content-Disposition", "attachment;"
					+ " filename="
					+ new String(fileName.getBytes(), "ISO-8859-1"));
			
			
			java.io.File t_file = new java.io.File(fileForm.getId()); 
			FileInputStream out = new FileInputStream(t_file);
			OutputStream os=response.getOutputStream();
			byte[] b=new byte[5000];
			while(out.read(b)!=-1){
				os.write(b);
			}
			os.flush();
			out.close();
			os.close();
		} catch (Exception e) {
			//throw new ModuleException(e.getMessage());
			ShowMessage.print(request, response, "文件不存在!");
			
		}
		return null;
	}
铂金苍鹰
铂金苍鹰
@红薯 : 老大 finaly里面报空指针异常了,想不通啊
铂金苍鹰
铂金苍鹰
@红薯 : 恩这个疏忽了
红薯
红薯
xxx.close() 应该在 finally 块
0
铂金苍鹰
铂金苍鹰

引用来自“龙崽”的答案

	public ActionForward download(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws ModuleException {
		ProjectinfoFileForm fileForm = (ProjectinfoFileForm) form;
		ProjectinfoFile file=new  ProjectinfoFile();

		String fileName=fileForm.getId().substring(fileForm.getId().lastIndexOf("/")+1,fileForm.getId().length());
		
		System.out.println(fileName);
		         
		try {

			response.setContentType("application/x-msdownload");
			response.setHeader("Content-Disposition", "attachment;"
					+ " filename="
					+ new String(fileName.getBytes(), "ISO-8859-1"));
			
			
			java.io.File t_file = new java.io.File(fileForm.getId()); 
			FileInputStream out = new FileInputStream(t_file);
			OutputStream os=response.getOutputStream();
			byte[] b=new byte[5000];
			while(out.read(b)!=-1){
				os.write(b);
			}
			os.flush();
			out.close();
			os.close();
		} catch (Exception e) {
			//throw new ModuleException(e.getMessage());
			ShowMessage.print(request, response, "文件不存在!");
			
		}
		return null;
	}
当下载出错的时候 throw new ModuleException ;现在想实现疲敝抛出异常 而转换为输出一个alert()提示下载错误,以上代码并没有能实现 alert提示  而是直接下了一个空文件,只是文件名跟请求的文件名一样的空文件
0
scl33
scl33
文件不存在直接返回404, 通过web.xml中配置的404处理页面统一展示.
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String id = request.getParameter("id");
		String fileName = request.getParameter("fileName");
		String showName = request.getParameter("showName");
		String openType = request.getParameter("openType");
		String basePath = request.getParameter("basePath");
		String getContent = request.getParameter("getContent");
		String getServiceStatusOnly = request.getParameter("getServiceStatusOnly");
		if ("true".equals(getServiceStatusOnly)){
			String result = null;
			if (!this.enabled || this.closing) result = "文件服务已关闭!";
			else if (request.getSession(false) == null) result = "用户身份验证失效, 请重新登陆!";
			else result = "{fileSize:"+this.fileMaxSize+",showFileSize:'"+getShowSize(this.fileMaxSize)+"',batchSize:"+this.batchMaxSize+",showBatchSize:'"+getShowSize(this.batchMaxSize)+"'}";
			response.setCharacterEncoding("UTF-8");
			response.getWriter().write(result);
			return;
		}
		if (!this.enabled || this.closing) {
			response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE, "服务已关闭,请求被拒绝!");
			log.warn("[servlet report]服务已关闭,请求被拒绝!");
			return;
		}
		if (request.getSession(false) == null){
			response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "用户身份不能确认,请重新登陆,并再次尝试!");
			log.warn("[servlet report]用户身份不能确认,请重新登陆,并再次尝试!");
			return;
		}
		
		if(fileName!=null && fileName.trim().length()<1) {
	    	request.setAttribute("error", "您所请求的文件信息不完整或没有找到对应文件!");
	    	response.sendError(HttpServletResponse.SC_NOT_FOUND, "您所请求的文件信息不完整或没有找到对应文件!");
	    	log.warn("[servlet report][request attachment]文件名未指定");
		} else {
			FileInputStream fis = null;
			ServletOutputStream ops = null;
			try {
				basePath = basePath == null ? "" : basePath;
				//basePath = new String(basePath.getBytes(), "UTF-8");
				fileName = fileName == null ? "" : fileName;
				//fileName = new String(fileName.getBytes(), "UTF-8");
				showName = showName == null ? fileName : showName;
			    File fileLoad = new File(basePath+fileName);
			    if (fileLoad.isFile() && fileLoad.canRead()){
			    	String fileType = fileName.lastIndexOf(".")>-1?fileName.substring(fileName.lastIndexOf(".")+1,fileName.length()).toLowerCase().trim():"";
			    	String contentType = mimeMap.get(fileType)==null?"application/octet-stream;":(String)mimeMap.get(fileType);
			    	openType = openType == null ? "attachment;" : openType+";";
			    	if (!"1".equals(getContent)){
					    response.setHeader("Content-Disposition", openType+" filename=\"" + java.net.URLEncoder.encode(showName, "UTF-8") +"\"");
					    response.setHeader("Content-Length",String.valueOf(fileLoad.length()));
			    	}
				    response.setContentType(contentType+"; charset=GBK;");
				    
				    log.debug("[servlet report][request attachment] : "+id+"|"+fileName+"|"+showName+"|"+contentType+"|"+openType);
				    
				    fis = new FileInputStream(fileLoad);
				    ops = response.getOutputStream();
				    fis.getChannel().transferTo(0, fileLoad.length(), Channels.newChannel(ops));
//				    int n = 0;
//				    byte b[] = new byte[1024 * 8];
//				    while((n = fis.read(b))!=-1 && ops!=null && !this.closing){
//				    	ops.write(b,0,n);
//				    }
			    }else {
			    	request.setAttribute("error", "您所请求的文件信息不完整或没有找到对应文件!");
			    	response.sendError(HttpServletResponse.SC_NOT_FOUND, "您所请求的文件信息不完整或没有找到对应文件["+basePath+fileName+"]!");
			    	log.warn("[servlet report][request attachment]文件["+basePath+fileName+"]未找到");
			    }
			}catch(Exception e) {

			}finally{
				try{
					if (fis!=null) fis.close();
					if (ops!=null) ops.close();
				}catch(Exception e){
					fis = null;
					ops = null;
				}
			}
		}

scl33
scl33
@龙崽 : 最简单的办法是当前页面不动, 弄一个隐藏的iframe, 点击下载的时候, 将下载的URL赋值给iframe.src, 而在404统一处理页面中弹出错误值(我的代码里是request.getAttribute("error")), 这样当前页面不会刷新, 有错误也会弹出, 没错误会出现保存文件对话框.
铂金苍鹰
铂金苍鹰
你的方法是可解决这个提示问题的,我还有一些疑问:如果放到统一界面去处理的话,如何实现返回上一个页面呢(不包括浏览器的后退按钮哦)
铂金苍鹰
铂金苍鹰
看到了你的finally,刚刚我的空指针疑惑解决了;
0
scl33
scl33

最简单的办法是当前页面不动, 弄一个隐藏的iframe, 点击下载的时候, 将下载的URL赋值给iframe.src, 而在404统一处理页面中弹出错误值(我的代码里是request.getAttribute("error")), 这样当前页面不会刷新, 有错误也会弹出, 没错误会出现保存文件对话框.

或者实现返回处理, 请求前将当前url保存, 如果url不是很长也可以当作url参数传递.

	private void handleReponse(HttpServletRequest request, HttpServletResponse response, Map param){
		String returnType = request.getParameter("returnType");
		String returnValue = request.getParameter("returnValue");
		try{
			//返回json数据
			if ("json".equals(returnType)){
				response.getWriter().println(BeanUtil.toJson(param));
			//返回用户回调
			}else if ("method".equals(returnType)){
				if (returnValue != null) {
					response.getWriter().println("<script>"+returnValue+"(\""+BeanUtil.toJson(param).replaceAll("([\'\"])", "\\\\$1")+"\");</script>");
				}
			//重定向到指定url
			}else if ("url".equals(returnType))
				response.sendRedirect(returnValue == null ? "" : returnValue);
			//返回到指定forward
			else if ("mapping".equals(returnType)){
				RequestDispatcher rd = request.getRequestDispatcher(returnValue);
				if (rd!=null) rd.forward(request, response);
			//仅返回写入值
			}else if ("result".equals(returnType)) response.getWriter().println(request.getAttribute("uploadResult"));
		}catch(Exception e){
		}
		return;
	}

铂金苍鹰
铂金苍鹰
json 异步 在项目中并没有用,对这个也不是很了解丫,
0
铂金苍鹰
铂金苍鹰
       java.io.File t_file=    new java.io.File(fileForm.getId());
        if(t_file.length()<=0){
        ShowMessage.print(request, response, "您请求的文件不存在!");
        return null;
        }
//因为下载是用 response.setHeader()这个方法的,所以在方法前 //先判断对应传来路径下有没有文件
0
铂金苍鹰
铂金苍鹰

引用来自“龙崽”的答案

       java.io.File t_file=    new java.io.File(fileForm.getId());
        if(t_file.length()<=0){
        ShowMessage.print(request, response, "您请求的文件不存在!");
        return null;
        }
//因为下载是用 response.setHeader()这个方法的,所以在方法前 //先判断对应传来路径下有没有文件
这个简单多了
返回顶部
顶部