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

Java/Spring Boot系统访问RedHat NFS及文件路径配置问题

Spring Boot 访问RedHat NFS路径及文件上传下载路径配置

我基于Java/Spring Boot开发的系统需要展示、下载TXT文件,本地服务器上NFS上传及前端文件列表代码能正常运行,但部署到Git仓库对应的环境后失效。现需解决两个问题:

  1. 如何从系统访问RedHat NFS路径/Dev/nfs/sopptFiles/
  2. 如何配置文件上传与获取的路径

现有代码

后端上传代码

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路径的方法

  1. 确认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
      
  2. 赋予进程访问权限

    • 确保运行Spring Boot的用户(如tomcat、java进程所属用户)对NFS目录有读写权限:
      chown -R 进程用户名:进程用户组 /Dev/nfs/sopptFiles/
      chmod -R 755 /Dev/nfs/sopptFiles/
      
  3. 替换动态路径为绝对路径

    • 原代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:27:44