Jerseyでアップロードされたファイルを処理する
サーバーサイド
Jerseyでマルチパート(multipart/form-data)によりアップロードされたファイルを処理するためには、jersey-multipartというモジュールを使用します。
pom.xmlのdependencyにjersey-multipartを追加します。
<dependencies> <!-- ... --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>1.9</version> </dependency> <dependency> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-multipart</artifactId> <version>1.9</version> </dependency> </dependencies>
サーバサイドのコードは以下のようになります。アップロードされたファイルを標準出力に書き出すだけですが。
@Path("/files") public class FileResource { @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public void load( @FormDataParam("foo") InputStream is, @FormDataParam("bar") String bar) { System.out.println("foo:" + org.apache.commons.io.IOUtils.toString(is)); System.out.println("bar:" + bar); } }
fooというパラメータ名でアップロードされたファイルをInputStreamとして受け取ります。barは普通の文字列のフォーム値です。
クライアントサイド
テストのため作成したサービスにアクセスするクライアントを作成してみます。
pom.xmlのdependencyにjersey-clientとjersey-multipartを追加します。
<dependencies> <!-- ... --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.9</version> <scope>test</scope> </dependency> <dependency> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-multipart</artifactId> <version>1.9</version> <scope>test</scope> </dependency> </dependencies>
テストコードは以下のようになります。
@Test public void testUpload() throws Exception { Client c = Client.create(); // "rest"はコンテキストパス WebResource r = c.resource("http://localhost:8080/rest/files"); MultiPart multiPart = new MultiPart(); // アップロードするファイル File f = new File("foo.txt"); org.apache.commons.io.IOUtils.FileUtils.writeStringToFile(f, "foo1"); FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("foo", f); multiPart.bodyPart(fileDataBodyPart); // その他のフォーム値 FormDataBodyPart formDataBodyPart = new FormDataBodyPart("bar", "bar1"); multiPart.bodyPart(formDataBodyPart); ClientResponse response = r .header("Content-type", "multipart/form-data") .post(ClientResponse.class, multiPart); assertEquals(200, response.getStatus()); System.out.println(response); }
正常に動作していれば、サーバサイドでは、
foo: foo1
bar: bar1
クライアントサイドでは、
POST http://localhost:8080/rest/files returned a response status of 200 OK
と出力されます。
参考
- Jersey と Apache Tomcat を使って RESTful な Web サービスを作成する
- Consuming RESTful Web Services With the Jersey Client API (Enterprise Tech Tips)
- Jersey - HTTP Form Posting using Jersey Client vs Apache HttpClient
- 作者: Bill Burke,arton,菅野良二
- 出版社/メーカー: オライリージャパン
- 発売日: 2010/08/23
- メディア: 大型本
- 購入: 28人 クリック: 780回
- この商品を含むブログ (35件) を見る