Spring Boot 上传文件后没有可读权限
使用 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);
}