背景
以下の要件に対応するためにフォームのinput type="file"でなく、base64化したイメージ文字列をサーバに返すことになりました。
(base64文字列は、リサイズしたイメージをcanvasに書き込んで、toDataURL()で取得します。)
- 電波が悪い宿泊施設がある
- 大きな画像を登録するとすごく時間がかかる。
- 「画像のリサイズ」とか言われてもよくわからない年配の人が多い
- そこで画像を自動でリサイズしてからアップロードして欲しい。
問題点
処理を実装してサーバにsubmitしたところ以下のエラーが発生しました。HTTPステータスコードは413です。
Memory buffer full on part <フォームのname>
対策
なんのこっちゃ?と調べてみたら、FormのParseの上限サイズ(既定では100KB)にひっかかっている模様。コンフィグで拡張したところ解決しました。
(公式)Body parsers > Max content length
play.http.parser.maxDiskBuffer=10MB
play.http.parser.maxMemoryBuffer=10MB
おまけ
サーバ側での実装(イメージ文字列をBufferedImageに変換するまで)は以下のような感じ。Java8です。
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
// 'data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAYAAAA+VemSAAAgAEl...=='
String imageString = source.split(",")[1];
byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(imageString);
BufferedImage bufferedImage = ImageIO.read(new java.io.ByteArrayInputStream(imageBytes));
[参考]java - Convert base64 string to image - Stack Overflow
https://stackoverflow.com/questions/23979842/convert-base64-string-to-image