1

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

@Entity
class UploadFile {
  ...
  public CommonsMultipartFile getFileData()
  {
    return fileData;
  }
}

但这不起作用,因为没有这样的数据库映射类型。在网上搜索,我发现人们似乎适应了两种方法之一:

  • 将字段定义为java.sql.blob;
  • 将字段定义为byte[]

@Controller类中,传入的内容HttpServletRequest被强制转换MultipartHttpServletRequest为访问MultipartFile并将其转换回流byte[]

然而,使用这个方案,我得到了令我困惑的“随机”结果:有时,我遇到“bean property not readable”错误,可能是 byte[] 字段上 getter 方法的返回类型不匹配。我仔细检查了我的 Bean 定义,并没有发现任何错误。

我想我的问题有两个方面:(1)知道为什么在这种情况下会发生此错误吗?(2)更重要的是,像这样处理上传文件的“推荐”方式是什么?

谢谢

奥利弗

4

1 回答 1

2

您是正确的,ajava.sql.blob或 abyte[]是在数据库中存储上传文件的最合适方式。

您不应将 aMultipartFile或 a存储CommonsMultipartFile在数据库中,因为它们是临时对象。请注意MultipartFilejavadoc 中的这一点:

文件内容要么存储在内存中,要么临时存储在磁盘上。在任何一种情况下,如果需要,用户负责将文件内容复制到会话级别或持久存储。临时存储将在请求处理结束时被清除。

我不太了解您正在做什么,HttpServletRequest但这听起来不是处理上传的最简单方法。处理上传的最简单方法是MultipartFile在控制器方法上设置 a 参数(如果您使用的是 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[]数组中 - 因此在用于处理上传的任何临时文件被删除之前。

于 2011-03-08T06:31:58.217 回答