LoginSignup
1
2

More than 3 years have passed since last update.

Jerjey(Jax-rs)でmultipart/form-dataの受け取り

Last updated at Posted at 2020-01-23

はじめに

[Android]端末からサーバへ画像のアップロードにて受け取る側がServletになっていました。本当はJerjeyで受け取りたかったのですが、勝手がわからず妥協していました。今回その方法がなんとなくわかったので紹介させていただきます。

環境

  • Eclipse 4.13.0
  • java 11
  • Jerjey 2.29

multipart/form-dataを対応させる

以下をダウンロードしてください。

この2つにパスを通します。

Applicationクラスを作成

このままでは、multipart/form-dataがまだ使えないので対応させたいプロジェクトのパッケージ内に
[ApplicationConfig.java]を作成し、以下をコピペしてください。

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]を変更します。

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対応が完了しました。

実装

以下クラスを作成してください。

Upload.java
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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2