フレームワーク2を再生する2 MySQLにファイルをアップロードします
-
11-12-2019 - |
質問
Play Framework2を使ってimageをMySQLにアップロードしようとしています。
Play Framework 1.24では、「play.db.jpa.Blob
」と"multipart/form-data"
を使用してMySQLに画像をアップロードします。
Play Framework2では、Blob
がありません... "multipart/form-data"
を使ってMySQLを使用してイメージをアップロードできますか?
解決
あなたはあなたのファイルをデータベースに保存しないでください。それは悪い考えです。代わりに、ファイルをいくつかのローカルまたは遠隔ファイルシステムにアップロードし、データベース内のファイル名/ファイルパスを保存するだけです。
編集:ダウンボットとしての答え以来、もう少し説明しようとします:
-
まず、PlayフレームワークのBLOB型を操作するときは、データベースにBLOBフィールドを作成します。しかし、すべてのデータベースがBLOB型の背後にあるのと同じ実装を持つわけではありません。一部のRDMでは、BLOB型は限られたストレージを持ち、もう1つ(MySQLなど)にはBLOBフィールドの最大サイズが設定によって決定されます。
-
次に、データベースからファイルを取得してユーザーに送信すると、メモリ使用量は爆発する予定です。非常に単純に、PlayはBLOBフィールドをユーザーに送信する前にメモリにロードします。
-
plusデータベースにたくさんのファイルが保存されている場合は、非常に早くオーバーロードされます。 (リクエスト)。次に移動するとデータベースを新しいマシンに移動します。しかし、データが多くの場合、次のボトルネックがデータベースではなく、アプリケーションとデータベースサーバの間のバンドスイッチではありません。
-
ファイルストレージのデータベースを使用すると、データベースによって作成されたオーバーヘッドのために、直接ファイルシステムの読み取りよりも遅くてメモリが遅くなります。
ファイルストレージエンジンとしてのデータベースを使用すると、ソリューションが簡単で迅速に設定できますが、プロジェクト中に後で物事が本当に変わる可能性がある場合はいっぱいです。
他のヒント
別の方法で、データベースの参照を格納できます。
ビュー:
<form action="@routes.Application.index" method="POST" enctype="multipart/form-data">
Photo<input type="file" name="photo"> <br>
<input type="submit" value="Submit">
</form>
.
<form action="@routes.Application.index" method="POST" enctype="multipart/form-data">
Photo<input type="file" name="photo"> <br>
<input type="submit" value="Submit">
</form>
コントローラ:
MultipartFormData body = request().body().asMultipartFormData();
FilePart photo = body.getFile("photo");
if (photo != null) {
String fileName = photo.getFilename();
File file = photo.getFile();
File newFile = new File(play.Play.application().path().toString() + "//public//uploads//"+ "_" + fileName);
file.renameTo(newFile); //here you are moving photo to new directory
System.out.println(newFile.getPath()); //this path you can store in database
}
}
. これは、BLOBオブジェクトが透明なものを処理するものです。ファイルをファイルシステムに保存し、参照をDBに保存します。