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

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

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

有帮助吗?

解决方案

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

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

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

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

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

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

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

其他提示

另一种方法是,您可以在数据库中存储对照片的引用。

视图中:

<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 对象处理透明的内容。它将文件存储在文件系统中,并将引用存储在数据库中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top