はじめに
[Android]端末からサーバへ画像のアップロードにて受け取る側がServletになっていました。本当はJerjeyで受け取りたかったのですが、勝手がわからず妥協していました。今回その方法がなんとなくわかったので紹介させていただきます。
環境
- Eclipse 4.13.0
- java 11
- Jerjey 2.29
- 入れ方はこちら
multipart/form-dataを対応させる
以下をダウンロードしてください。
この2つにパスを通します。
Applicationクラスを作成
このままでは、multipart/form-dataがまだ使えないので対応させたいプロジェクトのパッケージ内に
[ApplicationConfig.java]を作成し、以下をコピペしてください。
package com.Sample.api;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;
public class ApplicationConfig extends ResourceConfig {
public ApplicationConfig() {
packages("pakage").register(MultiPartFeature.class);
}
}
"pakage"には使用するパッケージ名を各自入れてください。
次に[Web.xml]を変更します。
<servlet>
<servlet-name>jersey-app</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<!--ここの"pakage.ApplicationConfig"は上で作成したクラスのパスです。-->
<param-value>pakage.ApplicationConfig</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>
</servlet>
これでmultipart/form-data対応が完了しました。
実装
以下クラスを作成してください。
import static java.nio.file.StandardCopyOption.*;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
@Path("/Upload")
public class Upload {
@POST
@Path("/File")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String upload(@FormDataParam(value = "file") InputStream fileStream,
@FormDataParam(value = "file") FormDataContentDisposition fileDisposition) {
try {
Files.copy(fileStream, Paths.get("保存先フォルダ",fileDisposition.getFileName()), REPLACE_EXISTING);
return "END";
} catch (IOException e) {
throw new WebApplicationException(e, 500);
}
}
}
これでhttp://localhost/XX/api/Upload/File
(XXはパッケージ名)にファイルを送れば保存されるはずです。
参考
JAX-RSでファイルアップロード!
http://blog.yumix.net/entry/2012/12/17/002515
Jerseyの設定1(web.xmlとかApplicationクラスとか)
https://edgegram.hatenablog.jp/entry/2015/11/25/160433
java - JAX-RS HTTPマルチパートリクエスト
https://tutorialmore.com/questions-1757453.htm