将文件保存在两个单独的文件夹中时出现FileNotFoundException

时间:2012-06-17 23:11:59

标签: java file

我正在使用Spring和Hibernate。我使用commons-fileupload-1.2.2上传图像如下。

String itemName = null;
String files = null;        
String itemStatus="true";
Random rand=new Random();
Long randNumber=Math.abs(rand.nextLong());

Map<String, String> parameters=new HashMap<String, String>();

if (ServletFileUpload.isMultipartContent(request))
{
    ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
    List<FileItem> items = null;

    try
    {
         items = upload.parseRequest(request);
    }
    catch (FileUploadException e)
    {
         mv.addObject("msg", e.getMessage());
         mv.addObject("status", "-1");
    }

    for(FileItem item:items)
    {                
        if (!item.isFormField()&&!item.getString().equals(""))
        {
             itemName = item.getName();
             parameters.put(item.getFieldName(), item.getName());
             itemName = itemName.substring(itemName.lastIndexOf(File.separatorChar) + 1, itemName.length());

             itemName=randNumber+itemName;
             files = files + " " + itemName;

             ServletContext sc=request.getSession().getServletContext();
             File savedFile = new File(sc.getRealPath("images") , itemName);
             item.write(savedFile);

             File medium = new File(sc.getRealPath("images"+File.separatorChar+"medium") , itemName);
             item.write(medium);
        }
    }
}

解析请求后itemName是图像文件的名称(enctype="multipart/form-data")。

首先将图像保存在images文件夹中,然后保存在images/medium文件夹中。它不起作用导致FileNotFoundException,但当我只保存一个文件(注释掉其中一个)时,这个

File savedFile = new File(sc.getRealPath("images") , itemName);
item.write(savedFile);

或者

File medium = new File(sc.getRealPath("images"+File.separatorChar+"medium") , itemName);
item.write(medium);

它有效。为什么不能同时将文件保存在单独的文件夹中?

1 个答案:

答案 0 :(得分:1)

我没有使用apache commons-fileupload,但函数FileItem#write(File file)的apidoc说,两次写同一项可能不起作用。

  

如果多次调用此方法,则无法保证此方法成功   同一个项目。这允许特定实现使用for   例如,文件重命名,尽可能,而不是复制所有   基础数据,从而获得显着的性能优势。

DiskFileItem类的JavaDoc说,

  

这种方法只保证第一次工作一次   为特定项目调用。这是因为,如果是的话   方法重命名临时文件,该文件将不再可用   稍后再次复制或重命名。

您可能还想查看此JIRA: DiskFileItem Jira Issue

参考文献:FileItem JavaDocDiskFileItem JavaDoc