Spring Boot文件上传异常:数据库已保存但文件未实际存储(新手求助)
Spring Boot项目实现文件上传时,数据库已保存会员信息及文件名,控制台输出正确路径且接口返回成功,但目标路径里找不到上传的文件,求排查方法。
相关配置与代码
YML配置
file: upload-dir: src/main/resources/static/profileIMG
Controller核心代码
@PostMapping("/signup") public ResponseEntity<String> handleFileUpload(@RequestParam("profile_img_path") MultipartFile file, @RequestParam("id") String id, @RequestParam("password") String password, @RequestParam("name") String name, @RequestParam("nickname") String nickname, @RequestParam("age") int age, @RequestParam("gender") String gender, @RequestParam("tel") String tel) { MemberDTO memberDTO = new MemberDTO(); memberDTO.setId(id); memberDTO.setPwd(password); memberDTO.setName(name); memberDTO.setNickname(nickname); memberDTO.setAge(age); memberDTO.setGender(gender); memberDTO.setTel(tel); if (file.isEmpty()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("请选择文件"); } try { Path currentPath = Paths.get(System.getProperty("user.dir")).toAbsolutePath(); Path uploadPath = currentPath.resolve("src/main/resources/static").resolve(uploadDir); if (!Files.exists(uploadPath)) { Files.createDirectories(uploadPath); } String uniqueFileName = UUID.randomUUID().toString().substring(0, 8) + "_" + file.getOriginalFilename(); Path filePath = uploadPath.resolve(uniqueFileName); System.out.println("文件保存路径: " + filePath.toString()); Files.copy(file.getInputStream(), filePath); memberDTO.setProfileIMG(uniqueFileName); memberService.insertMember(memberDTO); } catch (IOException e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上传失败"); } return ResponseEntity.ok("会员注册完成"); }
确认
uploadDir变量是否正确注入
YML里配置了file.upload-dir,但代码里直接用了uploadDir,必须通过@Value("${file.upload-dir}")注解把配置值注入到这个变量里。如果没做这一步,uploadDir是空的,文件会被存到src/main/resources/static目录下,去这个目录找找看有没有上传的文件。去控制台输出的绝对路径里找文件
不要只看IDE里显示的src/main/resources/static/profileIMG,控制台输出的是完整绝对路径(比如/Users/xxx/your-project/src/main/resources/static/profileIMG/xxx.jpg),直接打开这个路径对应的文件夹检查,而不是依赖IDE的文件目录显示(IDE可能不会实时刷新运行时生成的文件)。检查目标目录的写入权限
手动去控制台输出的路径下创建一个文件,看能不能成功。如果创建失败,说明该目录没有写入权限,需要调整目录权限或者更换上传路径。验证文件是否真的被写入
在Files.copy代码后面加一行调试代码:System.out.println("文件写入完成,大小:" + Files.size(filePath));如果控制台输出了文件大小,说明文件确实存在,只是你之前找错了地方;如果没输出,说明代码逻辑有问题(但你数据库已经保存,这种情况概率低)。
排查jar包运行的路径问题
如果是用java -jar命令运行项目,src/main/resources是jar包内部的目录,无法写入文件。这种情况必须把上传路径改成项目外部的目录,比如/opt/upload/profileIMG,同时在YML里更新配置,代码里也要对应调整路径解析逻辑。检查文件名是否有特殊字符
虽然用了UUID前缀,但原文件名如果有特殊字符(比如中文、空格、特殊符号),可能导致路径解析异常。试试上传一个文件名简单的文件(比如test.jpg),看能不能正常找到。
内容的提问来源于stack exchange,提问作者Shin-Hyeoncheol

