我正在尝试使用JPA将上传的文件保存到数据库。最“自然”的方式(对我来说)是将域对象定义为:
@Entity
class UploadFile {
...
public CommonsMultipartFile getFileData()
{
return fileData;
}
}
但是这不起作用,因为没有这样的数据库映射类型。在线搜索,我发现人们似乎适应了这两种方法中的一种:
java.sql.blob;
byte[]
在@Controller
课程中,传入的HttpServletRequest
会被投射到MultipartHttpServletRequest
,以便访问MultipartFile
并将其转换回byte[]
流。< / p>
然而,有了这个方案,我有“随机”的结果让我感到困惑:我不时遇到“bean属性不可读”错误,可能在byte []字段上返回类型的getter方法不匹配。我对我的Bean定义进行了双重和三重检查,并且找不到任何错误。
我想我的问题有两个方面:(1)知道为什么在这种情况下会发生这种错误? (2)更重要的是,这样处理上传文件的“推荐”方式是什么?
感谢
奥利弗
答案 0 :(得分:2)
您是正确的,java.sql.blob
或byte[]
是将数据库中存储上传文件的最佳方式。
您不应将MultipartFile
或CommonsMultipartFile
存储在数据库中,因为这些是临时对象。请注意MultipartFile
javadoc:
文件内容存储在内存中或临时存储在磁盘上。 在任何一种情况下,用户都负责将文件内容复制到 会话级或持久性存储,如果需要。临时存储 将在请求处理结束时清除。
我不太了解您对HttpServletRequest
所做的事情,但这听起来不是处理上传的最简单方法。处理上传的最简单方法是在控制器方法上设置MultipartFile
参数(如果您使用的是Spring 3.0或更高版本,我认为):
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void exampleFileUpload(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
try {
byte[] fileBytes = file.getBytes();
// Persist those bytes using JPA here
} catch (IOException e) {
// Exception handling here
}
}
}
这应该可靠地工作,因为您在请求完成之前将字节提取到byte[]
数组中 - 因此在用于处理上载的任何临时文件被删除之前。