それなりに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