在项目开发中我们有些模板文件excel,和图片需要保存下来用在系统中回显。
开始的时候我们为了项目快速上线没有设置minio为私有的,用公有权限,这样只要获取我们的连接地址就能无限的获取我们minio上的文件,然后设计的公司营业执照授权书等等都被暴露了,做漏扫的时候我们一些本地文件因为测试账号密码也被公之于众。
后续处理问题我们将权限设置成私有的 上传文件的时候会返回一个唯一的文件名字,如果是替换文件我们就提供一个不修改文件名字的接口把文件覆盖掉。
上传文件
@PostMapping("/upload")
public ViewResult upload(@RequestParam("file") MultipartFile multipartFile) throws Exception {
return ViewResult.success(this.minioConfig.putObject(multipartFile));
}
/**
* 上传
*/
public String putObject(MultipartFile multipartFile) throws Exception {
File file=new File(multipartFile.getName()+ UUID.randomUUID()); //名字修改上传 不修改覆盖文件
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
boolean bl =ImageConverter.isImageIO(file);
if(file.exists()){
file.setWritable(true);
file.setReadable(true);
file.setExecutable(true);
boolean deleted =file.delete();
}
// bucket 不存在,创建
if (!minioClient.bucketExists(this.bucket)) {
minioClient.makeBucket(this.bucket);
}
try (InputStream inputStream = multipartFile.getInputStream()) {
// 上传文件的名称
String fileName = multipartFile.getOriginalFilename();
// PutObjectOptions,上传配置(文件大小,内存中文件分片大小)
PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
// 文件的ContentType
putObjectOptions.setContentType(multipartFile.getContentType());
minioClient.putObject(this.bucket, fileName, inputStream, putObjectOptions);
// 返回访问路径
//return this.url + UriUtils.encode(fileName, StandardCharsets.UTF_8);
return UriUtils.decode(fileName, StandardCharsets.UTF_8);//防止转码文件名字不存在的问题
}
}
通过文件名字获取临时访问权限的路径 过时连接失效。
@PostMapping("/downloadUrl")
public ViewResult downloadUrl(@RequestParam("fileName")String fileName) throws Exception {
return ViewResult.success(this.minioConfig.downloadUrl(fileName));
}
public String downloadUrl(String fileName) throws Exception {
int expiration = 60 * 60; // 1 hour in seconds
// 生成GET请求的预签名URL
return minioClient.presignedGetObject(bucket, fileName, expiration);
}
部署minio重启命令
MINIO_ROOT_USER=gzlwork MINIO_ROOT_PASSWORD=gzlwork nohup minio server --address 0.0.0.0:33626 --console-address 0.0.0.0:33625 /app/minio/data >/app/minio/minio.log 2>&1 &
MINIO_ROOT_USER 指定用户名
MINIO_ROOT_PASSWORD 指定密码
/app/minio/data 挂载文件目录 上传文件保存的目录
--address 0.0.0.0:33626 --console-address 0.0.0.0:33625 指定控制台访问端口 文件访问端口