gpt4 book ai didi

java - 将 CommonsMultipartFile 保存到数据库

转载 作者:行者123 更新时间:2023-11-30 05:05:31 24 4
gpt4 key购买 nike

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

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

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

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

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

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

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

谢谢

奥利弗

最佳答案

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

您不应将 MultipartFileCommonsMultipartFile 存储在数据库中,因为它们是临时对象。请注意 MultipartFile javadoc 中的这一点:

The file contents are either stored in memory or temporarily on disk. In either case, the user is responsible for copying file contents to a session-level or persistent store as and if desired. The temporary storages will be cleared at the end of request processing.

我不太明白你对 HttpServletRequest 所做的事情,但这听起来不像是处理上传的最简单方法。处理上传的最简单方法是使 MultipartFile 成为 Controller 方法上的参数(我认为,如果您使用的是 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[] 数组中 - 因此在删除用于处理上传的任何临时文件之前。

关于java - 将 CommonsMultipartFile 保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com