Java/Spring Boot系统访问RedHat NFS及文件路径配置问题
Spring Boot 访问RedHat NFS路径及文件上传下载路径配置
我基于Java/Spring Boot开发的系统需要展示、下载TXT文件,本地服务器上NFS上传及前端文件列表代码能正常运行,但部署到Git仓库对应的环境后失效。现需解决两个问题:
- 如何从系统访问RedHat NFS路径
/Dev/nfs/sopptFiles/ - 如何配置文件上传与获取的路径
现有代码
后端上传代码
public static String uploadFileVNP = System.getProperty("user.dir")+"/Dev/nfs/sopptFiles/VNP"; @PostMapping("/process_svnp") @PreAuthorize("hasAnyAuthority('MSA_USER', 'MSA_USER_ADMINISTRATIVE', 'MSA_MODERATOR', 'ADMIN')") public String msSoppProcesoRegistroVNP(SVNP svnp, String date, String id, String date_ic, String date_fc, @RequestParam("fileVNP") MultipartFile[] fileVNP) { if(svnpRepository.existsRecordSVNP(date, id, date_ic, date_fc)) { return "redirect:/msa?filter=home?error"; } StringBuilder fileNames = new StringBuilder(); for(MultipartFile file : fileVNP) { Path fileNameAndPath = Paths.get(uploadFileVNP, file.getOriginalFilename()); fileNames.append(file.getOriginalFilename()); try { Files.write(fileNameAndPath, file.getBytes()); } catch (IOException e) { e.printStackTrace(); } } svnpService.registerSVNP(svnp); return "redirect:/msa?filter=Home?success"; }
前端文件列表代码
$("#refFileVacTarget").text(svnp.refFileVac); let link="/VNP/" + svnp.refFileVac; $('#refFileVacTarget').attr('href', link);
一、访问RedHat NFS路径的方法
确认NFS挂载状态
- 在RedHat服务器上执行以下命令,检查
/Dev/nfs/sopptFiles/是否已正确挂载NFS共享:mount | grep nfs - 若未挂载,执行挂载命令(替换远程NFS服务器IP和共享目录):
mount -t nfs 远程NFS服务器IP:/共享目录 /Dev/nfs/sopptFiles/ - 配置开机自动挂载,编辑
/etc/fstab添加一行:远程NFS服务器IP:/共享目录 /Dev/nfs/sopptFiles/ nfs defaults 0 0
- 在RedHat服务器上执行以下命令,检查
赋予进程访问权限
- 确保运行Spring Boot的用户(如
tomcat、java进程所属用户)对NFS目录有读写权限:chown -R 进程用户名:进程用户组 /Dev/nfs/sopptFiles/ chmod -R 755 /Dev/nfs/sopptFiles/
- 确保运行Spring Boot的用户(如
替换动态路径为绝对路径
- 原代码中
System.getProperty("user.dir")在部署环境中可能指向非预期目录,直接使用NFS绝对路径更可靠:public static final String UPLOAD_FILE_VNP = "/Dev/nfs/sopptFiles/VNP";
- 原代码中
二、文件上传与获取路径配置
1. 上传路径优化
- 修正路径逻辑,增加目录存在性检查和异常处理:
public static final String UPLOAD_FILE_VNP = "/Dev/nfs/sopptFiles/VNP"; @PostMapping("/process_svnp") @PreAuthorize("hasAnyAuthority('MSA_USER', 'MSA_USER_ADMINISTRATIVE', 'MSA_MODERATOR', 'ADMIN')") public String msSoppProcesoRegistroVNP(SVNP svnp, String date, String id, String date_ic, String date_fc, @RequestParam("fileVNP") MultipartFile[] fileVNP) { if(svnpRepository.existsRecordSVNP(date, id, date_ic, date_fc)) { return "redirect:/msa?filter=home?error"; } // 确保上传目录存在,避免写入失败 Path uploadDir = Paths.get(UPLOAD_FILE_VNP); if (!Files.exists(uploadDir)) { try { Files.createDirectories(uploadDir); } catch (IOException e) { return "redirect:/msa?filter=home?dirError"; } } StringBuilder fileNames = new StringBuilder(); for(MultipartFile file : fileVNP) { Path fileNameAndPath = uploadDir.resolve(file.getOriginalFilename()); fileNames.append(file.getOriginalFilename()); try { // 覆盖已存在文件或根据需求调整写入策略 Files.write(fileNameAndPath, file.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); } catch (IOException e) { e.printStackTrace(); return "redirect:/msa?filter=home?uploadError"; } } svnpService.registerSVNP(svnp); return "redirect:/msa?filter=Home?success"; }
2. 文件获取路径配置
- 前端无法直接访问NFS路径,需新增后端下载接口:
@GetMapping("/download/VNP/{fileName}") public ResponseEntity<Resource> downloadVNPFile(@PathVariable String fileName) throws IOException { Path filePath = Paths.get(UPLOAD_FILE_VNP).resolve(fileName); Resource resource = new UrlResource(filePath.toUri()); if (!resource.exists() || !resource.isReadable()) { throw new FileNotFoundException("文件不存在或无法读取: " + fileName); } return ResponseEntity.ok() .contentType(MediaType.TEXT_PLAIN) // TXT文件用TEXT_PLAIN,其他类型按需调整 .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") .body(resource); } - 修改前端代码指向新的下载接口:
$("#refFileVacTarget").text(svnp.refFileVac); let link="/download/VNP/" + svnp.refFileVac; $('#refFileVacTarget').attr('href', link);
3. 可选:配置文件管理路径
- 将路径写入
application.properties,方便部署时修改:file.upload.vnp.path=/Dev/nfs/sopptFiles/VNP - 在代码中注入配置:
@Value("${file.upload.vnp.path}") private String uploadFileVNP;
内容的提问来源于stack exchange,提问作者Djorkaeff
相关产品推荐
相关产品推荐

