1、认识和了解minio,不做过多赘述
官网地址
2、下载和解压安装包
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
# 授权
chmod 777 -R minio
# 设置用户名密码
export MINIO_ACCESS_KEY=admin
export MINIO_SECRET_KEY=MMmm123,
# 设置后台访问端口以及API交互端口
nohup ./minio server --console-address ":9000" --address ":9001" ./data/ > ./minio.log 2>&1 &
# 其中 9000为管理端访问端口 9001 为API端口
3、java对接
public class MinioConfig {
/**
* @return
* @Author zy
* @Description 新建连接 创建桶
* @Param
*/
@Bean
public MinioClient minioClient() {
try {
MinioClient minioClient =
MinioClient.builder()
.endpoint(MinioProperities.endpoint)
.credentials(MinioProperities.accessKey, MinioProperities.secretKey)
.build();
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(MinioProperities.bucketName).build());
if (!found) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(MinioProperities.bucketName).build());
setBucketPolicy(minioClient);
}
return minioClient;
} catch (Exception ex) {
throw new RuntimeException("init minio client fail...", ex);
}
}
/**
* @author zy
* @Description 设置桶权限,这边主要用于图片,所以设置成*的方式
* @Param [minioClient]
* @return void
**/
private void setBucketPolicy(MinioClient minioClient) {
String READ_WRITE = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\"Resource\":[\"arn:aws:s3:::" + MinioProperities.bucketName + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\"Resource\":[\"arn:aws:s3:::" + MinioProperities.bucketName + "/*\"]}]}";
try {
minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(MinioProperities.bucketName).config(READ_WRITE.toString()).build());
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置项,实际中替换成从配置文件中读取
public class MinioProperities {
public static String endpoint="http://192.168.1.10:9001"; // IP地址
public static Integer port = 9001; // 端口号
public static String accessKey="admin"; // 账号
public static String secretKey="MMmm123,"; // 密码
public static Boolean secure = Boolean.FALSE; // 是否使用安全连接
public static String region = "us-test"; // 桶的地域标签
public static String bucketName = "test"; //桶名称
public static String remoteUrl="http://192.168.1.10:9001"; //外网可访问的基础地址
public static Integer outTimeToConnect; //超时连接时间
}
上传文件
@Controller
@RequestMapping("/api/oss")
public class FileUploadController {
/**
* @author zy
* @Description 上传文件,成功返回文件的全路径,失败返回1001以及上传失败;
* @time 2021/9/13 13:54
* @Param [file, request]
* @return AjaxResult
**/
@ResponseBody
@RequestMapping(value = "/upload", method = {OPTIONS, POST})
public AjaxResult upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
try {
String upload = MinioUtils.upload(file);
if(StringUtil.isBlank(upload)){
return AjaxResult.error();
}
return AjaxResult.success(upload);
} catch (Exception e) {
return AjaxResult.error();
}
}
}
工具类,其中
MinioClient 通过统一的方式获取到bean,不抽取工具类时,直接使用 @Autowired 的方式注入即可
/**
* @author zy
* @title: MinioUtils
* @description: 文件服务器连接工具
*/
@Slf4j
public class MinioUtils {
/**
* @Description: 上传文件到文件服务器
* @Author: zy
* [file]
* java.lang.String 返回文件路径
**/
public static String upload(MultipartFile file) {
String name = getObjectName("file", file.getOriginalFilename(), DateUtil.sdf3ymdHms.format(new Date()));
return upload(minioClient, name, MinioProperities.bucketName, URLConnection.guessContentTypeFromName(file.getOriginalFilename().trim()), file);
}
private static String getObjectName(String mark, String fileName, String createTime) {
String objectName = mark + "/" + createTime + "_" + fileName;
return objectName;
}
/**
* @Description: 上传
* @Author: zy
* [minioClient, objectName, bucketName, mimeType, file, remoteUrl]
* java.lang.String
*/
private static String upload(MinioClient minioClient, String objectName, String bucketName, String mimeType, MultipartFile file) {
try {
minioClient.putObject(
PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(
file.getInputStream(), file.getSize(), -1).contentType(mimeType == null ? MediaType.APPLICATION_OCTET_STREAM_VALUE : mimeType)
.build());
String res = "/" + bucketName + "/" + objectName;
return res;
} catch (Exception ex) {
log.error("upload file error...", ex);
return null;
}
}
}
管理端访问地址
ip:9000
找打对应的桶即可查看;