playframework2を使用してmySQLに画像をアップロードしようとしています。
Play Framework 1.24では、「play.db.jpa.Blob
」と"multipart/form-data"
を使用して画像をmySQLにアップロードします。
しかし、playframework2にはありません... mySQLBlob
に使用して画像をアップロードするにはどうすればよいですか?"multipart/form-data"
playframework2を使用してmySQLに画像をアップロードしようとしています。
Play Framework 1.24では、「play.db.jpa.Blob
」と"multipart/form-data"
を使用して画像をmySQLにアップロードします。
しかし、playframework2にはありません... mySQLBlob
に使用して画像をアップロードするにはどうすればよいですか?"multipart/form-data"
ファイルをデータベースに保存しないでください。それは悪い考えです。代わりに、ファイルをローカルまたは離れたファイルシステムにアップロードし、ファイル名/ファイルパスのみをデータベースに保存する必要があります。
編集:私の答えは反対票を投じたので、もう少し説明しようと思います:
まず、Play FrameworkでBLOBタイプを操作すると、データベースにBLOBフィールドが作成されます。ただし、すべてのデータベースがblobタイプの背後に同じ実装を持っているわけではありません。一部のRDMSでは、Blobタイプのストレージが制限され、その他(MySQLなど)では、BLOBフィールドの最大サイズは構成によって決定されます。
次に、データベースからファイルを取得してユーザーに送信すると、メモリ使用量が爆発的に増加します。非常に単純な理由は、Playがblobフィールドをユーザーに送信する前にメモリにロードするからです。
さらに、データベースに大量のファイルが保存されている場合、データベースはすぐに過負荷になります。(リクエスト)。次の移動は、データベースを新しいマシンに移動することです。ただし、多くのデータが保存されている場合、次のボトルネックはデータベースではなく、アプリケーションとデータベースサーバー間のバンドウィズである可能性があります。
データベースをファイルストレージに使用すると、データベースによってオーバーヘッドが発生するため、ファイルシステムを直接読み取るよりも常に低速で多くのメモリを消費します。
データベースをファイルストレージエンジンとして使用することは、セットアップが簡単で迅速なソリューションですが、プロジェクトの後半で実際に状況が変わる可能性のある不便な点がたくさんあります。
別の方法では、写真への参照をデータベースに保存できます。
<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オブジェクトが透過的に処理するものです。ファイルをファイルシステムに保存し、参照をデータベースに保存します。