Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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 如何将文件字段(html表单)上载到数据库?_Java_Spring Boot_File Upload_Thymeleaf - Fatal编程技术网

Java 如何将文件字段(html表单)上载到数据库?

Java 如何将文件字段(html表单)上载到数据库?,java,spring-boot,file-upload,thymeleaf,Java,Spring Boot,File Upload,Thymeleaf,我有html表单(Thymeleaf),其中包含用于上传文件的字段 在模型对象中,字段文件设置如下: @Entity @Table(name = "services") public class Service { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "service_id") private Long serviceId; @Siz

我有html表单(Thymeleaf),其中包含用于上传文件的字段

在模型对象中,字段
文件
设置如下:

@Entity
@Table(name = "services")
public class Service {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "service_id")
  private Long serviceId;

  @Size(min = 5, message = "Please enter 5 symbols or more")
  @NotBlank(message = "This field is mandatory")
  private String event;

  @NotNull(message = "This field is mandatory")
  @DateTimeFormat(pattern = "yyyy-MM-dd")
  private LocalDate created;

  @DateTimeFormat(pattern = "yyyy-MM-dd")
  private LocalDate modified;

  private BigDecimal price;

  @Lob
  private byte[] file;
  ...
控制器:

@PostMapping("/services")
  public String addEvent(
      @Valid @ModelAttribute("service") Service service,
      BindingResult bindingResult,
      Model model
  ) {
    if (bindingResult.hasErrors()) {
      return "service-add-event";
    } else {
      serviceRepository.save(service);
    }
    List<Service> services = serviceRepository.findAll();
    model.addAttribute("services", services);
    return "redirect:/services";
    }
  }
@PostMapping(value = "/services", consumes = {"multipart/form-data"})
  public String addEvent(
      @Valid @ModelAttribute("service") Service service,
      BindingResult bindingResult,
      @RequestParam("maintenanceFile") MultipartFile maintenanceFile,
      Model model
  ) {
    if (bindingResult.hasErrors()) {
      return "service-add-event";
    } else {
      if (!maintenanceFile.isEmpty()) {
        try {
          byte[] fileBytes = maintenanceFile.getBytes();
          service.setFile(fileBytes);
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      serviceRepository.save(service);
      List<Service> services = serviceRepository.findAll();
      model.addAttribute("services", services);
      return "redirect:/services";
    }
  }
@PostMapping(“/services”)
公共字符串加法器(
@有效的@modeldattribute(“服务”)服务,
BindingResult BindingResult,
模型
) {
if(bindingResult.hasErrors()){
返回“服务添加事件”;
}否则{
serviceRepository.save(服务);
}
List services=serviceRepository.findAll();
model.addAttribute(“服务”,服务);
返回“重定向:/services”;
}
}
视图:


事件*
名称错误
...
维护文件
拯救
保存到数据库(H2嵌入式)后,我看到只有文件名保存到字段文件(例如
Testfile.txt
),而不是整个文件。为什么?


如何将整个文件保存到数据库?

我从其他开发人员那里得到了一些建议,并解决了这个问题

  • 首先,需要将
    enctype=“multipart/form data”
    放入
    form
    标记中

  • 第二,需要将表单对象分为两部分。带有简单字段的服务实例(字段
    文件
    将为“null”)。和多部分输入标记。这是必需的,因为multipart是一个流(不是字段),应该在控制器中单独处理

  • 然后,在控制器中,我们从multipart获取字节数组,将该字节设置为服务对象字段,并将实例保存到存储库

  • 代码示例:

    视图:

    
    事件*
    名称错误
    (...)
    维护文件
    拯救
    
    控制器:

    @PostMapping("/services")
      public String addEvent(
          @Valid @ModelAttribute("service") Service service,
          BindingResult bindingResult,
          Model model
      ) {
        if (bindingResult.hasErrors()) {
          return "service-add-event";
        } else {
          serviceRepository.save(service);
        }
        List<Service> services = serviceRepository.findAll();
        model.addAttribute("services", services);
        return "redirect:/services";
        }
      }
    
    @PostMapping(value = "/services", consumes = {"multipart/form-data"})
      public String addEvent(
          @Valid @ModelAttribute("service") Service service,
          BindingResult bindingResult,
          @RequestParam("maintenanceFile") MultipartFile maintenanceFile,
          Model model
      ) {
        if (bindingResult.hasErrors()) {
          return "service-add-event";
        } else {
          if (!maintenanceFile.isEmpty()) {
            try {
              byte[] fileBytes = maintenanceFile.getBytes();
              service.setFile(fileBytes);
            } catch (IOException e) {
              e.printStackTrace();
            }
          }
          serviceRepository.save(service);
          List<Service> services = serviceRepository.findAll();
          model.addAttribute("services", services);
          return "redirect:/services";
        }
      }
    
    @PostMapping(value=“/services”,使用={“多部分/表单数据”})
    公共字符串加法器(
    @有效的@modeldattribute(“服务”)服务,
    BindingResult BindingResult,
    @RequestParam(“维护文件”)多部分文件维护文件,
    模型
    ) {
    if(bindingResult.hasErrors()){
    返回“服务添加事件”;
    }否则{
    如果(!maintenanceFile.isEmpty()){
    试一试{
    byte[]fileBytes=maintenanceFile.getBytes();
    service.setFile(fileBytes);
    }捕获(IOE异常){
    e、 printStackTrace();
    }
    }
    serviceRepository.save(服务);
    List services=serviceRepository.findAll();
    model.addAttribute(“服务”,服务);
    返回“重定向:/services”;
    }
    }
    
    你忘了把
    表单
    标记放进去吗?@Slavavivanov是的,我没有把
    enctype=“multipart/form data”
    放在
    表单
    标记上,因为它导致了spring验证错误
    无法将多部分文件转换成所需的类型字节[]对于属性值
    ,必须将HTML表单中的
    enctype
    设置为正确的值,才能获取文件内容。您将以
    MultipartFile
    的形式获得它,并且需要自己将此对象转换为字节数组。例如,其中一个解决方案可能非常简单