java文件上传的两种方式的一些问题

时间:2024-05-22 17:21:54

接触到一个项目,一个java web项目,据说是十几年的写的代码,现在打算做新版本,先要我们项目组解决一下就版本代码里面的bug,以便现在的日常使用。

主要的bug是文件上传失败

打断点跟踪了一下,发现了问题:SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题

代码中在控制器里面自己完成request的解析,又在Spring MVC文件加入了上传配置的multipartResolver,直接注释这个配置,就可以用了

java文件上传的两种方式的一些问题

参考:SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题

然而,在测试其他地方的上传下载时,发现其他地方的不可用了,再次阅读源代码,发现了问题,因为代码利用使用了两种版本的上传,其他地方的上传需要用到SpringMVC的配置的multipartResolver

所以现在的解决办法就是统一,要么都使用SpringMVC里面的配置,要么都自己在控制器里面解析request

这里尝试了第二种(下面代码只针对上传excel表格,因为代码中这个位置只需要上excel)

修改前,需要SpringMVC配置multipartResolver

@RequestMapping("/regist111")
public String regist(@RequestParam(value="file") MultipartFile 
       file,HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		 // 判断文件是否为空  
		String filePath = null;
		File fileNew = null;
		if (file == null || file.isEmpty()) {
			String Msg = "请输入xls文件!";
			request.getSession().setAttribute("msg", Msg);
			return "admin/userRegist/index";

		}
        if (!file.isEmpty()) {  
        	
            try {  
                // 文件保存路径  
                filePath = request.getSession().getServletContext().getRealPath("/") + "upload/"  
                        + file.getOriginalFilename();  
                System.out.println(filePath);
                java.io.File fileExists=new java.io.File(filePath);
                if(!fileExists.exists()){
                	fileExists.mkdirs();
        		 }
                // 转存文件  
                fileNew = new File(filePath);
                //file.transferTo(new File(filePath));  
                file.transferTo(fileNew);
                System.out.println(fileNew.getName().substring(fileNew.getName().lastIndexOf(".")+1));
                if(!fileNew.getName().substring(fileNew.getName().lastIndexOf(".")+1).equals("xls")){
                	String Msg = "请输入xls文件!";
        			request.getSession().setAttribute("msg", Msg);
        			return "admin/userRegist/index";
                }
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
     return "admin/userRegist/index";
	}

修改后,注释SpringMVC配置multipartResolver

@RequestMapping("/regist")
public String regist1(HttpServletRequest request, HttpServletResponse response) throws Exception{
		// 判断文件是否为空
		if (!ServletFileUpload.isMultipartContent(request)) {
			String Msg = "请输入xls文件!";
			request.getSession().setAttribute("msg", Msg);
			return "admin/userRegist/index";
		}
		//创建一个基于硬盘的FileItem工厂
		FileItemFactory factory = new DiskFileItemFactory();
		//创建一个文件上传处理器
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding("UTF-8");
		//System.out.println("ldb---------21-------------------");
		// 解析HTTP请求消息头
		List items = upload.parseRequest(request);
		Iterator itr = items.iterator();
		String filePath = null;
		File fileNew = null;
		while (itr.hasNext()) {
			FileItem item = (FileItem) itr.next();
			String fileName = item.getName();
			// 文件保存路径
			filePath = request.getSession().getServletContext().getRealPath("/") + "upload/";

			System.out.println(filePath);
			java.io.File fileExists=new java.io.File(filePath);
			if(!fileExists.exists()){
				fileExists.mkdirs();
			}

			try {
				fileNew = new File(filePath,fileName);
				item.write(fileNew);
			} catch (Exception e) {
				String Msg ="上传文件失败。";
				request.getSession().setAttribute("msg", Msg);
				return "admin/userRegist/index";
			}
			if(!fileNew.getName().substring(fileNew.getName().lastIndexOf(".")+1).equals("xls")){
				String Msg = "请输入xls文件!";
				request.getSession().setAttribute("msg", Msg);
				return "admin/userRegist/index";
			}
		}
       return "admin/userRegist/index";
}

拍坑记录:

1:java.io.FileNotFoundException: .\xxx\xxx.txt (系统找不到指定的路径。)

2:java.io.FileNotFoundException: .\xx\xx (拒绝访问。)

当遇到问题1时,的确是当前所指定的文件不存在或者目录不存在。 
当遇到第二个问题时,是因为你访问的是一个文件目录,如果这个目录没有权限访问或者是目录不存在,就会抛出问题2的异常。

解决办法 
第一个的解决办法是,先判断一下当前文件是否存在,如果存在则略过,如果不存在,创建
第二个的解决办法是,在填写文件的路径时一定要具体到文件

参考:Java解决java.io.FileNotFoundException: E:\work\work (拒绝访问。)