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

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

主要的bug是文件上传失败

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

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

参考: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 (拒绝访问。)      

       

Java上传文件时出错,求大神帮助

05-26
上传文件时,文件上传,就是报了一个错误,错误代码如下: java.io.IOException: java.io.FileNotFoundException: E:\intelli IDEA\IntelliJ IDEA 2019.1.2\.IntelliJIdea\system\tomcat\Unnamed_Potato_3\work\Catalina\localhost\ROOT\upload_153e9ccf_dc34_49cf_8013_597e0454a311_00000009.tmp (系统找不到指定的文件。) at org.apache.catalina.core.ApplicationPart.write(ApplicationPart.java:122) at com.potato.util.FileUpload.UpUpload(FileUpload.java:57) at com.potato.servlet.uploadFile.doPost(uploadFile.java:27) at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at com.potato.Filter.FilterEncoding.doFilter(FilterEncoding.java:32) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:509) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2508) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2497) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.FileNotFoundException: E:\intelli IDEA\IntelliJ IDEA 2019.1.2\.IntelliJIdea\system\tomcat\Unnamed_Potato_3\work\Catalina\localhost\ROOT\upload_153e9ccf_dc34_49cf_8013_597e0454a311_00000009.tmp (系统找不到指定的文件。) at java.io.FileInputStream.open0(Native Method) at java.io.FileInputStream.open(FileInputStream.java:195) at java.io.FileInputStream.<init>(FileInputStream.java:138) at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.write(DiskFileItem.java:392) at org.apache.catalina.core.ApplicationPart.write(ApplicationPart.java:120) ... 28 more
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值