关于struts2文件上传出现java.io.FileNotFoundException异常的解决办法

时间:2022-01-18 08:35:18
最近在研究struts2文件上传实例,发现老是抛出java.io.FileNotFoundExceptionF:\apache-tomcat-6.0.32\webapps\struts2_1\upload\psbCA8YZS4S.jpg。经过网上查阅资料始终没有找到解决方案。后来看到一网友说把new File的路径改成绝对路径,试了下果然可以。可这并不程序的设计要求,不可能每次上传写一个绝对路径。后来因为巧合我又发现了一种解决办法。我在struts2的配置文件是这样的
        <action name="uploadAction" class="com.wang.blog.action.UploadAction">
<param name="allowTypes">
image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg
    </param>
<param name="savePath">/upload</param>
<result>/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
我配置了一个savePath就是文件上传的保存路径。Action中通过ServletActionContext.getServletContext().getRealPath(savePath)得到完整的保存路径,控制台打印就是这样的路径F:\apache-tomcat-6.0.32\webapps\struts2_1\upload,然后根据这个路径加上上传文件的名称new一个File实现文件保存。但最后会报FileNotFoundException,后来我在F:\apache-tomcat-6.0.32\webapps\struts2_1目录下创建了一个upload文件夹问题就决解了,不报错。是不是new File的时候程序不会帮我们创建一个upload文件夹?还是别的原因?请问像这种问题还有没其他的决解方法。毕竟这个方法太土每次都要自己创一个相应的文件夹。

4 个解决方案

#1


具体代码没看到,不过应该是这里出错的,
异常说,找不到你所说的文件夹,你代码里面有没有,检测文件夹这段啊,
如果没有的话加上吧
代码贴给你:

public String save() {
   if (file != null && file.exists()) {
       String path = ServletActionContext.getRequest().getRealPath("/image");
       String fileName = new UUIDGenerator().generate().toString(); //用UUID算法取名
       String data[] = fileFileName.split("\\.");
       String houzhui = data[data.length - 1]; // abc.cdf.jpg
       File to = new File(path, fileName + "." + houzhui);
   try {
       FileUtil.copyFile(file, to);     //这个是我封装的io流而已,你可以不管
        stu.setImage("/image/" + fileName + "." + houzhui);
   } catch (IOException e) {
        e.printStackTrace();
   }
  }
   //持久层处理代码省略
    return "save_next";
}


上面的代码很清晰,我是做的比较复杂,用了uuid替换原来上传的文件名,其他就是你想要知道的了

#2


你有没有试过new File("file").createNewFile();方法去创建    按理说是应该自动创建文件夹  有时候是不会创建  可以用 new File("dirs").mkdirs()方法来创建 有2个 一个mkdir 一个mkdirs 第二个子目录和父目录都会创建  创建文件夹有几率失败的 返回值是个boolean - -

#3


new File() 确实是不会自动创建不存在的目录的,因此在使用该方法时,经常需要先判断一下目录是否存在,如果存在那么一切OK,如果不存在,那么就先创建目录然后再创建文件。

#4


异常捕获处理下。

#1


具体代码没看到,不过应该是这里出错的,
异常说,找不到你所说的文件夹,你代码里面有没有,检测文件夹这段啊,
如果没有的话加上吧
代码贴给你:

public String save() {
   if (file != null && file.exists()) {
       String path = ServletActionContext.getRequest().getRealPath("/image");
       String fileName = new UUIDGenerator().generate().toString(); //用UUID算法取名
       String data[] = fileFileName.split("\\.");
       String houzhui = data[data.length - 1]; // abc.cdf.jpg
       File to = new File(path, fileName + "." + houzhui);
   try {
       FileUtil.copyFile(file, to);     //这个是我封装的io流而已,你可以不管
        stu.setImage("/image/" + fileName + "." + houzhui);
   } catch (IOException e) {
        e.printStackTrace();
   }
  }
   //持久层处理代码省略
    return "save_next";
}


上面的代码很清晰,我是做的比较复杂,用了uuid替换原来上传的文件名,其他就是你想要知道的了

#2


你有没有试过new File("file").createNewFile();方法去创建    按理说是应该自动创建文件夹  有时候是不会创建  可以用 new File("dirs").mkdirs()方法来创建 有2个 一个mkdir 一个mkdirs 第二个子目录和父目录都会创建  创建文件夹有几率失败的 返回值是个boolean - -

#3


new File() 确实是不会自动创建不存在的目录的,因此在使用该方法时,经常需要先判断一下目录是否存在,如果存在那么一切OK,如果不存在,那么就先创建目录然后再创建文件。

#4


异常捕获处理下。