2012-02-08 7 views
1

Camelサーブレットコンポーネントを使用してXML文書を受信しましたが、ファイル(jpeg、gifなど)も受信する必要があります。だからここに私のクライアントアプリがファイルを送信する方法である。Apache Camelサーバーアプリケーションがマルチパートフォームを受信して​​います。

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.MultipartEntity; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.impl.client.DefaultHttpClient; 

public class HttpClientUploadHelper { 
    public boolean upload(final File file, final String url) { 
     boolean wasSent = false ; 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost(url); 
     MultipartEntity entity = new MultipartEntity(); 
     entity.addPart(file.getName(), new FileBody(file)); 
     post.setEntity(entity); 
     try { 
      HttpResponse response = client.execute(post); 
      wasSent = response.getStatusLine().getStatusCode()==200; 
     } catch (Exception e) { 
     } 
     return wasSent; 
    } 
} 

私のキャメル・プロセッサは、その後のHttpServletRequestこのよう抽出します

​​

を、私は最終的にファイルを解析し、保存するには、このメソッドを持っています

import org.apache.commons.fileupload.FileItemFactory; 
import org.apache.commons.fileupload.FileItemIterator; 
import org.apache.commons.fileupload.FileItemStream; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import org.apache.commons.io.IOUtils 

... class declaration, body, etc... 

void parseAndSaveFile(final HttpServletRequest req) throws Exception { 
    // Check that we have a file upload request 
    boolean isMultipart = ServletFileUpload.isMultipartContent(req); 
    // Create a factory for disk-based file items 
    FileItemFactory factory = new DiskFileItemFactory(); 
    // Create a new file upload handler 
    ServletFileUpload upload = new ServletFileUpload(factory); 
    // Parse the request 
    FileItemIterator receivedFiles = upload.getItemIterator(req); 
    while (receivedFiles.hasNext()) { 
      FileItemStream file = receivedFiles.next(); 
      if (file.isFormField()) { 
      System.out.println("WTF?"); 
      } else { 
      String fileName = file.getName(); 
      File uploadedFile = new File("/home/myuser/" + fileName); 
      FileOutputStream out = new FileOutputStream(uploadedFile); 
      IOUtils.copy(file.openStream(), out); 
     } 
    } 
} 

Camel内で上記のコードを使用した場合、multipartフラグは "true"ですが、receivedFilesイテレータには要素が含まれていません。単純なサーブレットを持つ別のプロジェクトで上記のコードを使用すると、コードが機能します。どちらの方法でも、私はjettyをWebコンテナとして使用しています。

他の方法でラクラクプロセッサー内のファイル名とその内容を抽出する方法はありますか?

ありがとうございます!

答えて

0

Jettyを使用しているので、FileUploadプロジェクトではなく、付属のMultipartFilterの使用を検討しましたか?スーパークリーンで使いやすい。 javadocツールから

は「このクラスは、ファイルの入力項目を使用してHTML形式で送信されたマルチパート/フォームのデータストリームをデコードして送信されたファイルは一時ファイルに保存され、Fileオブジェクトが追加されています。他のすべての値は通常のgetParameter APIで利用可能になり、setCharacterEncodingメカニズムはバイトをStringに変換する際に尊重されます。

0

これは役に立ちますか?

 
    public void process(Exchange exchange) throws Exception { 
      Message in = exchange.getIn(); 
      Set names = in.getAttachmentNames(); 
      for(String n: names) { 
       System.out.println("attachment "+n); 
       DataHandler h = in.getAttachment(n); 
       if(h!=null) { 
        try { 
        Object o = h.getContent(); 
         System.out.println(o); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        }    
       } 
      } 
      if(!names.isEmpty()) 
       return; 
    } 
関連する問題