学而实习之 不亦乐乎

Spring Boot 上传文件后没有可读权限

2023-11-13 20:32:55

使用 SpringBoot上传文件至服务器后发现 group 和 other 没有读写权限,虽然可以用命令给文件夹添加写权限,如下:

# chmod -R 644 /path/to/uploaded/files

这样操作,虽然也可以正常访问,但用于生产环境还是不妥的。所以在代码中进行如下操作:

public RetResultVO fileUpload(@RequestParam("file") MultipartFile file){        

        // 先设定一个放置上传文件的文件夹(该文件夹可以不存在,下面会判断创建)
        Date now = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
        String month = sdf.format(now);
        String deposeFilesDir = attachmentDir+month;

        // 判断文件是否有内容
        if (file.isEmpty()) {
            result.setCode(ResponseCode.EXCEPTION.getCode());
            result.setMsg("该文件无任何内容!!!");
            return result;
        }

        // 获取附件原名(有的浏览器如chrome获取到的是最基本的含后缀的文件名,如myImage.png)
        // 获取附件原名(有的浏览器如ie获取到的是含整个路径的含后缀的文件名,如C:\\Users\\images\\myImage.png)
        String fileName = file.getOriginalFilename();
        String fileType = file.getContentType();

        // 如果是获取的含有路径的文件名,那么截取掉多余的,只剩下文件名和后缀名
        int index = fileName.lastIndexOf("\\");
        if (index > 0) {
            fileName = fileName.substring(index + 1);
        }

        //后面返回前端的使用
        String orname=fileName;
        /**long fileSize = file.getSize();

        // 判断单个文件大于5M
        if (fileSize > 5 * 1024 * 1024) {
            result.setCode(ResponseCode.EXCEPTION.getCode());
            result.setMsg("该文件大于5M");
            return result;

        }**/

        // 当文件有后缀名时
        if (fileName.indexOf(".") >= 0) {
            // split()中放正则表达式; 转义字符"\\."代表 "."
            String[] fileNameSplitArray = fileName.split("\\.");

            // 加上random戳,防止附件重名覆盖原文件
            fileName = UUIDUtil.getUUID() + "." + fileNameSplitArray[fileNameSplitArray.length-1];
        }

        // 当文件无后缀名时(如C盘下的hosts文件就没有后缀名)
        if (fileName.indexOf(".") < 0) {
            // 加上random戳,防止附件重名覆盖原文件
            fileName = UUIDUtil.getUUID();
        }  

      // 根据文件的全路径名字(含路径、后缀),new一个File对象dest
      String pathname=deposeFilesDir + "/" + fileName;
      File dest = new File(pathname);

      //将获取到的附件file,transferTo写入到指定的位置(即:创建dest时,指定的路径)
      file.transferTo(dest);

      //设置权限
      Set<PosixFilePermission> perms = new HashSet<>();
      perms.add(PosixFilePermission.OWNER_READ);
      perms.add(PosixFilePermission.OWNER_WRITE);
      perms.add(PosixFilePermission.GROUP_READ);
      perms.add(PosixFilePermission.OTHERS_READ);
      Files.setPosixFilePermissions(Paths.get(pathname), perms);
}