MinIO | The MinIO Quickstart Guide
介绍:
MinIO是在GNU Affero通用公共许可证 v3.0 下发布的高性能对象存储,对象存储是支持海量用户远程访问的无限容量廉价存储系统。
它由桶(bucket),组成目录结构,桶中直接存放对象(Object),桶中不能再创建通,但是要能创建文件夹。
MinIO | Code and downloads to create high performance object storage
通过命令minio server ./data
启动Minio
启动完成后,可以看到访问的路径http://127.0.0.1:9000,使用提供的账号密码进行登录
账号:minioadmin 密码:minioadmin
出现此界面说明登录成功,下面就可以创建桶了
Controller层:
/**
* 通用请求处理
*/
@RestController
public class CommonController extends BaseController {
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@Autowired
private ISysFileService fileService;
/**
* 通用上传请求
*/
@PostMapping("/common/upload")
public AjaxResult uploadFile(MultipartFile file){
try{
// 上传文件路径
return fileService.upload(file);
}catch (Exception e){
return AjaxResult.error(e.getMessage());
}
}
}
业务层:
@Service
@Slf4j
public class SysFileServiceImpl implements ISysFileService {
@Autowired
MinioConfig minioConfig;
/**
* 文件上传至Minio
* 使用try catch finally进行上传
* finally里进行资源的回收
*/
@Override
public AjaxResult upload(MultipartFile file) {
InputStream inputStream = null;
MinioClient minioClient = getClient();//创建Minio的连接对象
String bucketName = minioConfig.getBucketName(); //获取桶名
try {
inputStream = file.getInputStream();
//判断桶是否存在
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("桶名").build());
if (!exists) {//不存在 则创建一个新的
minioClient.makeBucket(MakeBucketArgs.builder().bucket("桶名").build());
} else {
log.info("bucketName '桶名' already Exists ");
}
/**
* 思路:我们上传的文件是:***.pdf
* 那么我们应该上传到配置的bucket内 我们配置的bucketName是--项目名
* 并且放在 --项目名/年/月/日/这个目录下
* 而对于同一个文件,存在重名问题,所以我们应该利用UUID生成一个新的文件名,并拼接上 .pdf 作为文件后缀
* 那么完整的路径就是 --项目名/年/月/日/uuid.pdf
*/
// 1. 文件名处理
String fileName = file.getOriginalFilename();
String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date())
+ UUID.randomUUID().toString().replaceAll("-", "")
+ fileName.substring(fileName.lastIndexOf("."));
//2. 文件上传 参数校验 和分片上传
PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
.bucket(bucketName)
.contentType(file.getContentType())
.stream(file.getInputStream(), file.getSize(), -1).build();
minioClient.putObject(objectArgs);
//3. 构建返回结果集,将文件名(fileName)和访问路径(url)返回
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", "/" + bucketName + "/" + objectName);
ajax.put("url","http://"+ minioConfig.getEndpoint() + ":" + minioConfig.getPort()
+ "/" + minioConfig.getBucketName() + "/" + objectName);
//4. 将结果返回
return ajax;
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("上传失败");
} finally {
if (inputStream != null) {
try {
inputStream.close(); // 关闭流
} catch (IOException e) {
log.debug("inputStream close IOException:" + e.getMessage());
}
}
}
}
/**
*
* 获取Minio连接
*
* @return
*/
private MinioClient getClient() {
MinioClient minioClient =
MinioClient.builder()
.endpoint("http://" + minioConfig.getEndpoint() + ":" + minioConfig.getPort())
.credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
.build();
return minioClient;
}
}
运行之后,我们建的桶里就会出现刚才上传的文件了。。。。。。。。。。。。。。