Jersey(JAX-RS)でファイルアップロード

mabushiisign

RESTのAPIでファイルアップロードを実装しようと思った。
そこで、どのように実装すればいいか調べてみた。
JerseyにMultipartのAPIがあることが分かった。

jersey-multipart 1.7 API

jerseyのサンプルプログラムの中にもmultipartのモノがある。
さっそく前回の記事のプロジェクトにコーディングしてみると、@FormDataParam などが解決できない。
どうやら、Jerseyの標準のライブラリに存在しないようだ。


ダウンロード画面に戻ると
11.4.4. Mail and MIME multipart
http://jersey.java.net/nonav/documentation/latest/chapter_deps.html#d4e1825
の章があり、ここに
-mimepull.jar
-jersey-multipart.jar
のリンクがあった。
早速ダウンロードしてビルドパスに通したらコンパイル出来た。

1@POST
2@Path("upload")
3@Consumes(MediaType.MULTIPART_FORM_DATA)
4public void upload(@FormDataParam("file") InputStream fileStream,
5                    @FormDataParam("file") FormDataContentDisposition fileDisposition,
6                    @FormDataParam("id") String id) {
7         
8    System.out.println("id:" + id);
9     
10    System.out.println("filename:" + fileDisposition.getFileName());
11    System.out.println("filesize:" + fileDisposition.getSize());
12             
13}

Mutipartの場合は、@FormParamではなく、@FormDataParamにします。
fileパラメータに対して、InputStreamを指定すればファイルを取得できます。
FormDataContentDispositionを指定すればMutipartの属性を取得できます。

実際に、テストをするためのHTMLを以下のように作成します。

1<form "post" action="http://localhost:8080/RestSample/user/upload" enctype="multipart/form-data">
2    <input type="file" name="file" /><br />
3    <input type="text" name="id" value="abc" /><br />
4    <br />
5    <input type="submit" value="upload" />
6</form>

これを指定すると、コンソールに以下の出力が行われます。

id:abc
filename:611uycaH2jL._SL500_AA300_.jpg
filesize:-1

どうやらファイルサイズはブラウザによってなのか期待できないのかもしれません。

とにかく、ファイルアップロードも問題なく対応できそうで何よりです。

ABOUT ME
mabushiisign
mabushiisign
B'zとdoaとミスチルと登山が好きな40代のプログラマです。 普段は、SIer企業で働いています。
記事URLをコピーしました