ファイル・データを送信する HTML 形式は、POST メソッドと「multipart/form-data」アクションを使用して構成する必要があります。
このデータは、IBM Java™ API for RESTful Web Services (JAX-RS) 実装を使用してデータを受け入れる JAX-RS リソース・メソッドが使用する 2 つの方法のいずれかによって受信が可能です。
このタスクについて
このタスクでは、multipart/form-data をコンシュームおよび生成するための JAX-RS メソッドの構成方法について取り上げます。
以下の例は、HTML フォームを示しています。
<form action="http://www.example.com/" method="POST" enctype="multipart/form-data">
<input type="text" name="fileid" />
<br />
<input type="text" name="description" />
<br />
<input type="file" name="thefile" />
<br />
<input type="submit" name="submit" value="submit"/>
</form>
IBM JAX-RS を実装することによりデータを複数のパーツに分けて受信することができ、必要に応じてそれらのパーツを自身で処理することができます。
手順
- リソース・メソッドを作成します。 次のリソース・メソッドを宣言して、HTTP POST から multipart/form-data コンテンツを受信しエコー出力します。
package com.example.jaxrs;
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(@FormParam("fileid") int theFileid,
@FormParam("description") String theDescription,
@FormParam("thefile") File theFile) {
// echo what we got in the form
BufferedOutMultiPart bomp = new BufferedOutMultiPart();
OutPart op = new OutPart();
op.setBody(theFile);
op.setContentType(MediaType.TEXT_PLAIN); // or other appropriate type, based on the file you received
bomp.setLocationHeader("thefile");
bomp.addPart(op);
op = new OutPart();
op.setBody(theDescription);
op.setContentType(MediaType.TEXT_PLAIN);
bomp.setLocationHeader("description");
bomp.addPart(op);
BufferedOutMultiPart bomp = new BufferedOutMultiPart();
OutPart op = new OutPart();
op.setBody(theFileid + ""); // just in case theFileid is uninitialized
op.setContentType(MediaType.TEXT_PLAIN);
bomp.setLocationHeader("fileid");
bomp.addPart(op);
return Response.ok(bomp, "multipart/form-data").build();
}
フォーム POST の実行依頼の発信元は、複数パーツ・メッセージの 1 つ以上のパーツの Content-Transfer-Encoding ヘッダーを生成できます。IBM JAX-RS 実装は、このヘッダーのエンコード・タイプが base64 または quoted-printable である場合に、このヘッダーに従ってパーツのペイロードを自動的にデコードしようとします。
- オプション: JAX-RS 1.1 の場合、IBM JAX-RS 実装によってパーツ・ペイロードを自動デコードしない場合には、メソッド・パラメーターに @Encoded アノテーションを付けます。 以下の例は、メソッド・パラメーターにおける @Encoded アノテーションの使用法を示しています。
package com.example.jaxrs;
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(@FormParam("fileid") int theFileid,
@FormParam("description") String theDescription,
@Encoded @FormParam("thefile") File theFile) {
// don't auto-decode the file part payload
...
}
multipart/form-data メッセージのすべてのパーツの検索とデコードを完全な制御下に置いて行う場合には、次のようにして BufferedInMultiPart オブジェクト自体を受信できます。
package com.example.jaxrs;
import org.apache.wink.common.model.multipart.BufferedInMultiPart;
import org.apache.wink.common.model.multipart.InPart;
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(BufferedInMultiPart bimp) {
List<InPart> parts = bimp.getParts();
// iterate over the "parts" and process them however you like
}
タスクの結果
IBM JAX-RS 実装でパーツを分割して自動デコードできるようにし、エンコードされたままのパーツを受信してユーザー自身で処理することにより、multipart/form-data Content-Type のデータを HTTP POST から受信し、エコー出力します。