将CommonsMultipartFile保留到数据库

时间:2011-03-08 05:51:16

标签: java spring-mvc file-upload apache-commons-fileupload

我正在尝试使用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)更重要的是,这样处理上传文件的“推荐”方式是什么?

感谢

奥利弗

1 个答案:

答案 0 :(得分:2)

您是正确的,java.sql.blobbyte[]是将数据库中存储上传文件的最佳方式。

您不应将MultipartFileCommonsMultipartFile存储在数据库中,因为这些是临时对象。请注意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[]数组中 - 因此在用于处理上载的任何临时文件被删除之前。