Java 将CommonsMultipartFile持久化到数据库
我正在尝试使用JPA将上传的文件持久化到数据库中。(对我来说)最“自然”的方式是将域对象定义为:Java 将CommonsMultipartFile持久化到数据库,java,spring-mvc,file-upload,apache-commons-fileupload,Java,Spring Mvc,File Upload,Apache Commons Fileupload,我正在尝试使用JPA将上传的文件持久化到数据库中。(对我来说)最“自然”的方式是将域对象定义为: @Entity class UploadFile { ... public CommonsMultipartFile getFileData() { return fileData; } } 但这不起作用,因为没有这样的数据库映射类型。在网上搜索时,我发现人们似乎采用了以下两种方法之一: 将字段定义为java.sql.blob 将字段定义为字节[] 在@Controll
@Entity
class UploadFile {
...
public CommonsMultipartFile getFileData()
{
return fileData;
}
}
但这不起作用,因为没有这样的数据库映射类型。在网上搜索时,我发现人们似乎采用了以下两种方法之一:
- 将字段定义为
java.sql.blob代码>
- 将字段定义为
字节[]
@Controller
类中,传入的HttpServletRequest
被转换为multipartttpServletrequest
,以便访问多部分文件
,并将其转换回字节[]
流
然而,在这个方案中,我得到了“随机”的结果,这让我感到困惑:有时,我会遇到“bean属性不可读”错误,字节[]字段上getter方法的返回类型可能不匹配。我反复检查了我的Bean定义,没有发现任何错误
我想我的问题有两个方面:(1)你知道为什么在这种情况下会发生这种错误吗?(2) 更重要的是,处理上传文件的“推荐”方式是什么
谢谢
Oliver您认为
java.sql.blob
或byte[]
将上传的文件存储在数据库中最合适的方式是正确的
您不应该在数据库中存储多部分文件
或公共多部分文件
,因为它们是临时对象。请从MultipartFile
javadoc中注意这一点:
文件内容要么存储在内存中,要么临时存储在磁盘上。
在这两种情况下,用户都负责将文件内容复制到
会话级别或持久存储(如需要)。临时仓库
将在请求处理结束时清除
我不太明白你在用HttpServletRequest
做什么,但这听起来并不是处理上传的最简单方法。处理上传的最简单方法是将MultipartFile
作为控制器方法的参数(如果您使用的是Spring 3.0或更高版本,我认为):
这应该能够可靠地工作,因为在请求完成之前,即在用于处理上载的任何临时文件被删除之前,您已经将字节提取到了
byte[]
数组中。感谢您的回复。一个简单的问题是:假设我在JSP中使用
来显示上传表单,并使用modeldattribute
将表单对象绑定到UpLoadFile
,路径
字段设置为fileData
。所以它应该是@RequestParam('fileData')
?这会导致类型不匹配问题吗?我刚刚检查过,它确实会导致类型不匹配问题。如果您使用的是带有文件上载的模型属性,那么您可以(我认为应该)将MultipartFile
放在表单(model)对象中,而不是将其用作方法参数。因此,您的控制器方法将是exampleFileUpload(@modeldattribute('fileData')UpLoadFile model)
,您的UpLoadFile
表单对象将包含一个属性MultipartFile文件您可以通过表单对象访问该文件,即model.getFile().getBytes()代码>。我终于让它工作了。作为结束语,关键不是用来定义输入文件,Spring会抱怨类型不匹配,除非放置额外的活页夹来帮助它。
@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
}
}
}