0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[playframework]フォームに長い文字列(100KB超え)を設定した時に発生する Memory buffer full on part <フォームフィールド名> エラーに対応

0
Last updated at Posted at 2019-12-23

背景

以下の要件に対応するためにフォームのinput type="file"でなく、base64化したイメージ文字列をサーバに返すことになりました。
(base64文字列は、リサイズしたイメージをcanvasに書き込んで、toDataURL()で取得します。)

  • 電波が悪い宿泊施設がある
  • 大きな画像を登録するとすごく時間がかかる。
  • 「画像のリサイズ」とか言われてもよくわからない年配の人が多い
  • そこで画像を自動でリサイズしてからアップロードして欲しい。

問題点

処理を実装してサーバにsubmitしたところ以下のエラーが発生しました。HTTPステータスコードは413です。

Memory buffer full on part <フォームのname>

対策

なんのこっちゃ?と調べてみたら、FormのParseの上限サイズ(既定では100KB)にひっかかっている模様。コンフィグで拡張したところ解決しました。

(公式)Body parsers > Max content length

application.conf
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

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?