Spring Boot图书上传需求:未上传图片时禁止保存图书
实现未上传图片则不保存图书的逻辑(Spring Boot图书管理)
要实现“未上传图片则不保存图书”的需求,只需在控制器的保存方法中新增图片必填校验逻辑,在保存图书前判断是否上传了有效图片,若未上传则终止流程并返回表单提示错误。
修改后的控制器代码
@PostMapping("/books") public String saveBook(@ModelAttribute("book") Book book, Model model, BindingResult bindingResult, @RequestParam(value = "image") MultipartFile image) throws IOException { bookValidator.validate(book, bindingResult); model.addAttribute("categories", bookCategoryService.findAll()); model.addAttribute("mode", "create"); // 先校验图书字段合法性 if (bindingResult.hasErrors()) { return "create_book"; } // 新增:校验图片是否上传有效文件 String fileName = null; if(image.isEmpty() || StringUtils.isEmpty(image.getOriginalFilename())) { // 未上传有效图片,添加错误提示并返回表单 bindingResult.rejectValue("photos", "error.book", "图片为必填项,请上传图书封面"); return "create_book"; } else { // 处理上传图片的文件名 fileName = StringUtils.cleanPath(image.getOriginalFilename()); book.setPhotos(fileName); } // 仅当图片校验通过时,才执行图书保存和文件上传 Book savedBook = bookService.saveBook(book); String uploadDir = "book-photos/" + savedBook.getId(); FileUploadUtil.saveFile(uploadDir, fileName, image); return "redirect:/"; }
关键修改点说明
严谨的图片校验:
- 同时使用
image.isEmpty()和StringUtils.isEmpty(image.getOriginalFilename())判断,覆盖“未选择文件”和“上传空文件”两种无效场景 - 若校验不通过,通过
bindingResult.rejectValue()添加错误提示,直接返回表单页面,阻止后续保存操作
- 同时使用
逻辑顺序调整:
- 确保只有图片上传有效时,才会执行图书入库和文件存储的操作,彻底避免无图片的图书被保存
原FileUploadUtil代码(无需修改)
package com.example.bookmanagement.util; import java.io.IOException; import java.io.InputStream; import java.nio.file.*; import org.springframework.web.multipart.MultipartFile; public class FileUploadUtil { public static void saveFile(String uploadDir, String fileName, MultipartFile multipartFile) throws IOException { Path uploadPath = Paths.get(uploadDir); if (!Files.exists(uploadPath)) { Files.createDirectories(uploadPath); } try (InputStream inputStream = multipartFile.getInputStream()) { Path filePath = uploadPath.resolve(fileName); Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING); } catch (IOException ioe) { throw new IOException("Could not save image file: " + fileName, ioe); } } }
内容的提问来源于stack exchange,提问作者hưng phạm khánh
相关产品推荐
相关产品推荐

