接触到一个项目,一个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 (拒绝访问。)