それなりにJava7・Java8のAPIを使いつつSpring Bootでファイルアップロードの処理を書いてみた

仕事でファイルアップロードのクライアント側を書くことになったのですが、サーバー側はチームの別の人が担当になりました。
クライアント(Python)とサーバー(C#)の言語が違うのでこんな割り振りになりました。
ただ個人的にサーバー側も作った方がテスト含めて色々都合がいいので、サーバー側も自分で書く事にしましたw
さらにどうせなら勉強したいと思っていたテクノロジーも使いたいなと思って、Spring BootとJava7、Java8のファイル周りのAPIを使って実装することにしました。


一部改変していますが、主な仕様はこんな感じです。

  • URL
/upload
  • メソッド
POST
  • パラメータ
parameter type required
name text
image file
  • レスポンスフォーマット
{
    "id":"1",
    "result":"true",
    "message":"OK"
}
  • 画像データを受け取って、ユーザーディレクトリ直下に保存する


レスポンスを固定で書くバージョンはすぐできたので、さらに独自の仕様を以下のように追加しました。

  • httpでもhttpsでもOK
  • レスポンスのidは数字の連番が返るようにする
  • パラメータ
parameter type required
name text
image file
resetCount file ×

「resetCount」に「true」を入れるとidの連番をリセット(1から開始する)して、パラメータはあってもなくても構わない。


この数字の管理をテキストファイルで保持して、この辺の処理をJava7、8らへんのAPIを使って処理してみました。


ここからはちょっと実装時にハマったポイントです。
Spring Bootで@RequestParamはそのままだと必ず必須になってしまうので、Optionalを使って対処しました。

@RequestParam("resetCount") Optional<Boolean> resetCount


Spring Bootでファイルアップロードをするときは、application.ymlに以下のパラメータでファイルのサイズをある程度指定しておかないと、大きいファイルをアップするとエラーが発生します。

multipart:
    maxFileSize: 104857KB
    maxRequestSize: 104857KB


Spring Bootでhttps通信をするときはkeytoolで証明書を作ってアプリケーションディレクトリの直下に配置して、application.ymlに以下のように指定することで可能になります。

server:
    port: 8080
    ssl:
        key-store: "server.jks"
        key-store-password: "tomcat"
        key-password: "tomcat"


作ったソースはこちら
spring-boot-file-upload-sample