2012-12-26 9 views
6

サーブレット3 @MultiPartConfig注釈を使用してアプリケーションでファイルアップロードを実装しています。実行時にmultipart-configの位置パラメータを設定する必要があります(annotaionパラメータのハードコードではありません)。サーブレットのmultipart-configへのプログラムによるアクセスのためのAPIはありますか?Servlet 3.0のMultiPartConfigへのプログラムによるアクセス

ありがとう

答えて

5

@ MultiPartConfigは本当にコンテナのマーカーインターフェイスです。サーブレットが初期化されると、提供されたアノテーション値はプロキシオブジェクトでマップされます。着信要求がマルチパート/フォームデータである場合、アップロードの部分は要求にマッピングされ、コンテナはアノテーションの値と要求の部分に基づいて必要な作業を実行します。あなたがこのプロセスを傍受する方法はありません。なぜなら、すべてがコンテナの勇気の中で起こるからです。しかし、1つの選択肢があります。これは、ファイルシステム操作を2回実行する必要があります。あなたはすべての部分を持っているので、ファイルを再構築し、あなたが選んだ場所にファイルを "再アップロード"することができます。以下のような方法があります。私はそれが明らかにコードを完了していない概念を実証するために自分のサーブレットで迅速にこれをテストしたが、覚えておいてください:

@Override 
protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) 
     throws ServletException, IOException { 

    httpServletResponse.setContentType("text/html"); 
    PrintWriter printWriter = httpServletResponse.getWriter(); 

    InputStream inputStream; 
    FileOutputStream fileOutputStream; 

    for (Part part : httpServletRequest.getParts()) { 

     inputStream = httpServletRequest.getPart(part.getName()).getInputStream(); 
     int i = inputStream.available(); 
     byte[] b = new byte[i]; 
     inputStream.read(b); 
     String fileName = ""; 

     for (String temp : part.getHeader("content-disposition").split(";")) { 
      if (temp.trim().startsWith("filename")) { 
       fileName = temp.substring(temp.indexOf('=') + 1).trim().replace("\"", ""); 
      } 
     } 

     String uploadDir = "/temp"; 
     fileOutputStream = new FileOutputStream(uploadDir + "/" + fileName); 
     fileOutputStream.write(b); 
     inputStream.close(); 
     fileOutputStream.close(); 

     printWriter.write("Uploaded file " + uploadDir + "/" + fileName + "."); 
    } 
} 
+0

このクリスタルクリアな例を見て

をやっていると、ランタイムファイルの場所を必要とします「再アップロードする」以外の方法はありません。部品。 –

0

私もあなたと同じ問題を抱えていたし、解決策は単純です:標準のサーブレット3.0ファイルのアップロードがあります十分ではない:だけのApacheするFileUploadコモンズから瓶をつかむと、あなたが@MultiPartConfigを使用している場合だけでストリーミングAPI

ServletFileUpload upload = new ServletFileUpload(); 

    // Parse the request 
    FileItemIterator iter = upload.getItemIterator(request); 
    while (iter.hasNext()) { 
     FileItemStream item = iter.next(); 
     String name = item.getFieldName(); 
     InputStream stream = item.openStream(); 
     if (item.isFormField() == false) 
      System.out.println("File field " + name + " with file name " 
      + item.getName() + " detected."); 
      FileOutputStream fos = new FileOutputStream("your_location"); 
      Streams.copy (stream, fos, true); 

     } 
    } 
+0

質問は@MultiPartConfigとファイルのアップロードに関するものでしたが、これはあなたが対処していませんでした。あなたは既にリクエストにあったアイテム(メモリにアップロードされているもの)からストリーミングしているので、もう一度「再アップロード」を読むだけです。 –

+0

@Brian Reindelそうではありません。私はStreaming APIを使って、再度アップロードしているわけではありません。私は、一時的なファイルやメモリにキャッシュすることなくリクエストを直接解析しています。 Streaming APIのメリットはメモリの効率的で高速な処理です。http://commons.apache.org/proper/commons-fileupload/streaming.htmlをご確認ください –

+0

あなたがサーブレットに入っており、コンテナを使用していると仮定すると、ファイルアイテムはどのように要求に達しましたか?バイトはすでにメモリにロードされています。アップロード中にコンテンツをリアルタイムでストリーミングしているわけではありません。 FileUploadに対するアプローチの利点は、その場合にファイルが最初にファイルシステムに書き込まれなければならないからです。私は、ディスク上の2つのファイルを管理する必要があることには問題があるとは言いません。しかし、この質問は特に@MultiPartConfigアノテーションとファイルの実行時の場所に対処するものであり、単純に一般的なファイルアップロードではありませんでした。 –

関連する問題