0

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が、1つのファイルだけを保存すると(そのうちの1つをコメントアウトする)、これはどちらかです

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);

できます。両方のファイルを別々のフォルダに一度に保存できないのはなぜですか?

4

1 に答える 1

2

私はapacheを使用していませんcommons-fileuploadが、関数のapidocにはFileItem#write(File file)、同じ項目を2回書き込むと機能しない可能性があると書かれています。

同じアイテムに対して複数回呼び出された場合、このメソッドが成功することは保証されません。これにより、特定の実装では、基礎となるすべてのデータをコピーするのではなく、可能な場合はファイルの名前変更を使用できるため、パフォーマンスが大幅に向上します。

DiskFileItemクラスのJavaDocは、次のように述べています。

このメソッドは、特定のアイテムに対して最初に呼び出されたときに1回だけ機能することが保証されています。これは、メソッドが一時ファイルの名前を変更した場合、そのファイルを後でコピーしたり、名前を変更したりすることができなくなるためです。

このJIRAもチェックしてください: DiskFileItem Jira Issue

参照:FileItem JavaDocDiskFileItem JavaDoc

于 2012-06-17T23:30:26.920 に答える