3

我正在尝试使用 play framework2 将图像上传到 mySQL。

在 play framework 1.24 中,我使用 " play.db.jpa.Blob" 并将"multipart/form-data"图像上传到 mySQL。

但是在play framework2中没有Blob......我如何将图像上传"multipart/form-data"到mySQL?

4

3 回答 3

6

绝对不应该将文件存储到数据库中。这是个坏主意。相反,您应该将文件上传到某个本地或远程文件系统,并且只将文件名/文件路径保存在数据库中。

编辑:由于我的回答被否决,我将尝试给出更多解释:

  1. 首先,在 Play 框架中使用 Blob 类型时,它将在您的数据库中创建一个 BLOB 字段。但是,并非所有数据库在 blob 类型后面都有相同的实现。在某些 RDMS 中,Blob 类型的存储空间有限,而在其他(例如 MySQL)中,blob 字段的最大大小将由配置决定。

  2. 其次,当您从数据库中检索文件并将它们发送给用户时,您的内存使用量将会爆炸。很简单,因为 Play 在将 blob 字段发送给用户之前将其加载到内存中。

  3. 另外,如果您的数据库中存储了大量文件,它将很快超载。(要求)。下一步将在新机器上移动数据库。但是如果你存储了很多数据,你的下一个瓶颈可能不是数据库,而是你的应用程序和数据库服务器之间的带宽。

  4. 由于数据库产生的开销,使用数据库进行文件存储总是比直接读取文件系统更慢且消耗更多内存。

将数据库用作文件存储引擎是一种简单快捷的设置解决方案,但它充满了不便,可能会在项目后期真正改变事情。

于 2012-07-25T13:06:30.573 回答
2

Another way, you can store reference to photo in database.

In view:

<form action="@routes.Application.index" method="POST" enctype="multipart/form-data">
           Photo<input type="file" name="photo"> <br>
             <input type="submit" value="Submit">    
</form>

In controller:

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
            }
}
于 2014-07-19T19:22:10.473 回答
-4

这就是 Blob 对象透明处理的内容。它将文件存储在文件系统中,并将引用存储在数据库中。

于 2012-09-07T07:34:30.253 回答