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

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

jersey-multipart 1.7 API

http://jersey.java.net/nonav/apidocs/latest/contribs/jersey-multipart/index.html


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

のリンクがあった。早速ダウンロードしてビルドパスに通したらコンパイル出来た。

@POST
@Path("upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void upload(@FormDataParam("file") InputStream fileStream,
                    @FormDataParam("file") FormDataContentDisposition fileDisposition,
                    @FormDataParam("id") String id) {
         
    System.out.println("id:" + id);
     
    System.out.println("filename:" + fileDisposition.getFileName());
    System.out.println("filesize:" + fileDisposition.getSize());
             
}


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

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

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

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

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

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

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