You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:/";
}

关键修改点说明

  1. 严谨的图片校验:

    • 同时使用image.isEmpty()和StringUtils.isEmpty(image.getOriginalFilename())判断,覆盖“未选择文件”和“上传空文件”两种无效场景
    • 若校验不通过,通过bindingResult.rejectValue()添加错误提示,直接返回表单页面,阻止后续保存操作
  2. 逻辑顺序调整:

    • 确保只有图片上传有效时,才会执行图书入库和文件存储的操作,彻底避免无图片的图书被保存

原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:40:33