2012-01-21 20 views
3

サーブレットを使用してアップロードフォームを作成しようとしていますが、これまでのところ次のことがあります。サーブレットアップロードするjava.io.FileNotFoundException:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

    if (isMultipart) { 
     FileItemFactory factory = new DiskFileItemFactory(); 
     ServletFileUpload upload = new ServletFileUpload(factory); 

     try { 
      List items = upload.parseRequest(request); 
      Iterator iterator = items.iterator(); 
      while (iterator.hasNext()) { 
       FileItem item = (FileItem) iterator.next(); 

       if (!item.isFormField()) { 
        String fileName = item.getName(); 

        String root = getServletContext().getRealPath(""); 
        File path = new File(root + "/uploads"); 

        if (!path.exists()) { 
         boolean status = path.mkdirs(); 

        } 

        File uploadedFile = new File(path + "/" + fileName); 
        System.out.println(uploadedFile.getAbsolutePath()); 
        item.write(uploadedFile); 

       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

罰金、しかし、それは常にjava.io.FileNotFoundExceptionがスローされますファイルをアップロードするようだ: は私が何か間違ったことをしたのでしょうか。

ERROR:

/Applications/Tomcat/apache-tomcat-6.0.35/wtpwebapps/work/uploads/texsxxdddst.xml 
/Applications/Tomcat/apache-tomcat-6.0.35/wtpwebapps/work/uploads 
java.io.FileNotFoundException: /Applications/Tomcat/apache-tomcat-6.0.35/wtpwebapps/work/uploads (No such file or directory) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:194) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:145) 
    at org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:426) 
    at servlets.uploadServlet.doPost(uploadServlet.java:48) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:680) 
+0

例外に関する詳細を掲載していただけますか? – Thomas

+0

どのファイルがエラーをスローしますか?どのファイル名が終わっているか確認しましたか? –

+0

例外で更新されました – Lunar

答えて

1

私の推測では、ファイルを書きたいディレクトリが書き込み禁止になっているか、そこに書き込む権利がないと思います。いずれにしても、これらのファイルはこのディレクトリに書き込まないでください。なぜなら、Webアプリケーションをアンデプロイまたは再デプロイすると削除されるからです。 TomcatのディレクトリがTomcatの責任であると考えてください。

アップロードを保存するTomcat以外のディレクトリを選択し、このパスを含むパラメータを使用してWebアプリケーションを設定します。コードでこのパラメータを使用して、パスを取得し、アップロードされたファイルを書き込みます。

+0

私は、c:/ tmpのようなものを使用していますが、C:を持っていないとどうなりますか?/ – Lunar

+0

もう一つのパスを選択します。私の答えを理解しましたか?アイデアは、パスを外部化(web.xmlのパラメータ、プロパティファイル、システムプロパティ、データベースの設定など)することによって、パスを構成可能にすることです。 –

+0

そうですね、私はこれを試してみたのですが、権限が正しければまだエラーが出ています – Lunar

1

http://commons.apache.org/fileupload/apidocs/org/apache/commons/fileupload/disk/DiskFileItemFactory.htmlでドキュメントを読んでください:

If not otherwise configured, the default configuration values are as follows:

  • Size threshold is 10KB.
  • Repository is the system default temp directory, as returned by System.getProperty("java.io.tmpdir").

あなたが現在使用している現在の作業ディレクトリ、System.getProperty("java.io.tmpdir")に対して見てする必要がありません。

それ以外の場合は、オーバーロードされたDiskFileItemFactoryコンストラクタを使用して、ファイルの格納場所を明示的に指定します。

JBの答えは同様に有効です。私がここで言及した内容を修正したとしても、Webアプリケーションを実行しているプロセス/ユーザーには、選択したディレクトリに適切な権限があることを確認する必要があります。

+0

私はオーバーライドを使用しましたが、私は書き込むことができますが、例外はまだ与えられています。 – Lunar

関連する問題