【多文件上传解决方案】解决java.io.IOException: java.io.FileNotFoundException(Is a directory)

最近做了一个多文件上传,其实和一般的文件上传功能大同小异,文件在服务器创建文件时,先判断路径是否存在,再去创建多级文件夹的文件。之前由于不大了解总报错,后面发现是路径问题

一、报错问题

java.io.IOException: java.io.FileNotFoundException:
/***/**.png (Is a directory)
(No such file or directory)
这两个报错都是我们拼接路径的问题,由于前端上传的文件是遍历文件夹的方式,原始文件名是包含/***/***.png它的原文件夹路径的,处理上要注意。

二、功能实现

2.1Controller

    /**
     * 多个文件/文件夹上传上传
     * 批量上传
     * (随机文件夹目录保存上传的所有文件,返回相对路径)
     * @return url
     */
    @RequestMapping(value = "/filesUpload")
    public String  filesUpload(@RequestParam(value = "files") MultipartFile[] files) {
    
    
  	    String url = "";
        try {
    
    
            url = numberPersonService.filesUpload(files);
        } catch (Exception e) {
    
    
            return ""+ e;
        }
        return  url;
    }

2.2ServiceImpl

    @Override
    public String filesUpload(MultipartFile[] files) {
    
    
//    	String url = "D:\\file";
        String url = "/***/filetomcat/webapps";
        String path = "/file/***/" + RandomStringUtils.randomAlphanumeric(4)+ System.currentTimeMillis()+ "/";
        //判断file数组不能为空并且长度大于0
        log.info("files.length :"+ files.length);
        if (files != null && files.length > 0) {
    
    
            //循环获取file数组中得文件
            for (int i = 0; i < files.length; i++) {
    
    
                MultipartFile file = files[i];
                //保存文件
               if(saveFile(file, url+path)){
    
    
                   log.info("filesUpload - url :"+  url+path);
               }
            }
        }else {
    
    
            path = "500";
        }
        return path;
    }


    /***
     * 保存多个文件,并且能创建子文件夹
     * @return
     */
    private boolean saveFile(MultipartFile file, String path ) {
    
    
        // 判断文件是否为空
        if (!file.isEmpty()) {
    
    
            try {
    
    
                File filepath;
                if ( !file.getOriginalFilename().contains("/")) {
    
    
                    filepath = new File(path);
                }else {
    
    
                    //截取最后一个“/” 之前
                    String n=file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("/"));
                    //截取最后一个“/” 之后
//                    String n1=path.substring(file.getOriginalFilename().lastIndexOf("/"));
                    filepath = new File(path + n);
                }
                //判断该目录是否有文件夹 没有则创建
                if (!filepath.exists()){
    
    
                    filepath.mkdirs();
                }
                // 目标文件保存路径
                String savePath = path + file.getOriginalFilename();
                // 转存文件
                file.transferTo(new File(savePath));
                return true;
            } catch (Exception e) {
    
    
                e.printStackTrace();
                log.error(" saveFile  path" + path +  e );
            }
        }
        return false;
    }

猜你喜欢

转载自blog.csdn.net/qq_48424581/article/details/129559067