Dropwizardでファイルアップロード

やること

Wordファイルをアップロードして中の文字列を読み込む。

pom.xmlの設定

pomに追加。バージョンで結構ハマる

                <!-- ファイルアップロードに必要 -->
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>2.25.1</version>
        </dependency>
                <!-- Wordを扱うのに必要 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

最新2.26はエラー(2017/10/05 時点)

2017-10-05 14:47:34,892INFO  [main] org.eclipse.jetty.util.log: Logging initialized @7298ms to org.eclipse.jetty.util.log.Slf4jLog
INCLUDE_ALL

バージョンを2.25.1に落とすとあっさり通ったので、今回はそれで進める。

リソースクラスの設定

今回はシンプルにWordファイルの中のテキストを返すだけです。
Wordの読み込みにPOIを使用しています。@FormDataParamのInputStreamから直接読み込みます。

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Path("/word-upload")
    public Response get(
                        @FormDataParam("file") InputStream uploadedInputStream,
                        @FormDataParam("file") FormDataContentDisposition fileDetail) throws IOException {

        XWPFDocument document = new XWPFDocument(uploadedInputStream);
        XWPFWordExtractor we = new XWPFWordExtractor(document);
        String text = we.getText();
        if (text == null || text.equals("")) {
            return Response.noContent().build();
        }
        return Response.ok(text).build();
    }

Mainクラスの設定

以下の設定を追加します。

environment.jersey().register(MultiPartFeature.class);

試してみる

アップロードするサンプルファイルは以下です。

Formタグからアップロードすると、以下の結果となりました。

アップロードがうまくいっていますね。

サーバサイドエンジニア。オムライスが好物

シェアする

  • このエントリーをはてなブックマークに追加

フォローする