2011-03-09 19 views
2

サーブレットのJava - ファイルアップロードの問題

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import java.util.Iterator; 
import java.util.List; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.*; 

public class Apply extends HttpServlet 
{ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException 
    { 
     InputStreamReader input = new InputStreamReader(request.getInputStream()); 
     BufferedReader buffer = new BufferedReader(input); 
     String line=""; 
     line=buffer.readLine(); 

     System.out.println("Multipart data " + line); 

     boolean isMultipart = ServletFileUpload.isMultipartContent(request); 
     if(isMultipart) 
     { 
      // upload file 
     } 
     else 
     { 
      // failed, no input 
     } 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
          throws ServletException, IOException 
    { 
     doPost(request, response); 
    } 
} 

JSP。

 <form enctype="multipart/form-data" method="post" action="apply"> 
      <fieldset> 
       <br/> 
       <legend>Upload</legend> 
       <br/> 
       <label>Select file to upload</label> 
       <input type="file" name="file" /><br /> 
       <br/> 
       <a href="apply" class="jUiButton">Submit</a> 
      </fieldset> 
     </form>  
     <script>$(".jUiButton").button()</script> 

ブール値と入力は常にfalse/nullとして検証され、なぜその理由がわかりません。このガイドの後:

web-inf/libには、commons-fileupload-1.2.2.jarとcommons-io-2.0.1.jarがあります。

アイデア?

+1

ブログの紹介テキストは[mine]のripoff(http://balusc.blogspot.com/2007/11/multipartfilter.html)です。リンクに言及してくれてありがとう。 – BalusC

答えて

3

あなたは実際にフォームを送信していません。 GETリクエストでページに移動します。

送信ボタンを使用して「送信」のアンカーを置き換えます

<button type="submit" class="jUiButton">Submit</button> 

あなたは<a>を保つことができるが、その後、手動でフォームを送信するためにJavaScriptを使用しなければならないでしょう。

+0

JavaScriptのことで変更されています。彼のサーブレットの 'doPost()'はどうやって呼び出されましたか? – BalusC

+3

@BalusC:彼の 'doGet()'は 'doPost()'を呼び出すので。 – Jeremy

1

事前にHttpServletRequest#getInputStream()を読んではいけません。一度だけ読み取ることができます。 Commons FileUploadはあなたがそれをあらかじめ読んだら、もう読むことができません。 ServletFileUpload#isMultipartContent()行までサーブレットのすべての行を取り除く。

-1

あなたがフォローしているガイドは古くなっています(2008年)。これが新しいプロジェクトの場合は、アノテーションベースのアプローチから始めたいと思うかもしれません。 This guide(2010年)に従う方が良いかもしれません。ファイルアップロードコントローラは、次のようになります。

@Controller 
public class FileUploadContoller { 
    @RequestMapping(value = "/fileupload", method = RequestMethod.POST) 
    @ResponseStatus(HttpStatus.OK) 
    @ResponseBody 
    public String ingest(@RequestParam("file") final MultipartFile file) throws Exception { 
     if (file.isEmpty()) { 
      System.out.println("empty"); 
     } else { 
      System.out.println("not empty"); 
     } 

     // do something with file.getBytes() 

     return("ok"); 
    } 
} 

これはコントローラのみであり、適切なSpring設定を追加する必要があります。あなたがこのルートを下りたいなら、私はさらに助けることができます。

関連する問題