Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将CommonsMultipartFile持久化到数据库_Java_Spring Mvc_File Upload_Apache Commons Fileupload - Fatal编程技术网

Java 将CommonsMultipartFile持久化到数据库

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

我正在尝试使用JPA将上传的文件持久化到数据库中。(对我来说)最“自然”的方式是将域对象定义为:

@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
        }
    }
}