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

と出力されます。