2013-06-18 12 views
7

に私は私ジャージRESTfulなWebサービスを作成しましたがうまく動作するメソッドのシグネチャとして@Context HttpServletRequest requestを使用してファイル多数をアップロードするを管理していました。
事は、私は繰り返しWebサービスは、私が思うと呼ばれるたびに必要なフィールドが存在するかどうかを確認するかしないファイルや.getFieldName();の相対.getName();.isFormField();方法、および.getString();方法でチェックする必要があり、他のフォームフィールドを取得するために、ありますいくつかの他のフィールドがある場合は、時間がかかり、高価なプロセスはほとんどありません。複数ファイルのアップロードジャージ

簡単なアプローチは、使用するWebサービスを渡す必要があるクライアントのパラメータが、が、私は一度に複数のファイルをアップロードすることはできませんよです問題にさらさ@FormDataParamを使用することでした。

メディアタイプまたはenctypeがmultipart/form-dataの場合、request.getParameter("field1");を使用して他のフォームフィールドを取得することもできません。

私は一緒に@FormDataParam@Context HttpServletRequest requestの両方を組み合わせることをしようとしたときはいつでも、それは例外スロー:ServletFileUploadクラスの.parseRequest(request);方法で要求を解析中
org.apache.tomcat.util.http.fileupload.FileUploadException: Stream closed
を。

良いアプローチをお勧めします。どのようにして、複数のファイルをアップロードするには、必要なフォームフィールドをジャージーの@FormDataParamと同じように簡単に取得できますか。複数のファイルのアップロードのための

アプローチ:

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
@Path("/multipleFiles") 
public String restDemo(@Context HttpServletRequest request) 
{ 
    //...code goes here 
} 

マイ形式:

enter image description here

出力:

(リクエストを解析した後)

フィールド1> ABC
フィールド2> XYZ
Chrysanthemum.jpgサイズ:879394
Desert.jpgサイズ:845941
Hydrangeas.jpgサイズ:595284
Jellyfish.jpg サイズ:775702

+0

@FormDataParamを使用するときに複数のファイルをアップロードできない理由は分かりませんが、 「複数のファイル」とは、アップロードするファイルの数が可変であることを意味します(フォームに「ファイルを追加」をクリックして追加のアップロードフィールドを取得できます)。 – Jonas

+0

@Jonasこれは、ユーザーがUIからファイルを追加できるのですが、 '@ FormDataParam'を使ってすべてのファイルに追いつくにはどのようなアプローチが必要ですか?私の知る限り、複数のファイルを単一の '@FormDataParam'にマッピングすることはできません。 – agpt

答えて

15

の場合あなたが使用することができます

<form name="formtest" action="rest/multipleFiles" method="POST" enctype="multipart/form-data"> 
    <input type="text" name="atext" value="abc" /> 
    <input type="text" name="btext" value="123" /> 
    <input type="file" name="zfile" value="" /> 
    <input type="file" name="zfile" value="" /> 
    <input type="submit" value="submit" /> 
</form> 

フィールドは、このように、同じ名前を持ちます
@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
@Path("/multipleFiles")  
public String restDemo(@FormDataParam("zfile") List<FormDataBodyPart> zfile) 

ここで、HttpServletRequestを使用することをお勧めします。

+0

あなたは私が他の詳細については処理できないことを知っているので、なぜHttpServletRequestを使用すべきではないのか説明してください。 – agpt

+6

Jerseyと混合されたHttpServletRequestを使用すると、使用する前にストリーム、バッファを閉じることがあります。 JAX-RSはサーブレットを直接使用することを避けるために作られたためです。現在では、必要に応じてサーブレットと直接対話する必要がある場合があります。 WebコンテナとJAX-RSの実装、Tomcat/Glassfish/JBossとJersey/CXF/Resteasyに依存します。 –

+0

+1なぜjax-rsで 'HttpServletRequest'を使わないのか説明してください。私はこの同じ問題に直面しています。 – agpt