Java 如何将文件字段(html表单)上载到数据库?
我有html表单(Thymeleaf),其中包含用于上传文件的字段 在模型对象中,字段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
文件设置如下:
@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
的形式获得它,并且需要自己将此对象转换为字节数组。例如,其中一个解决方案可能非常简单