对象存储服务MinIO
MinIO简介
MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。
MinIO特点
-
数据保护
Minio使用Minio Erasure Code(纠删码)来防止硬件故障。即便损坏一半以上的driver,但是仍然可以从中恢复。
-
高性能
作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GB/s的写速率
-
可扩容
不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心
-
SDK支持
基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持
-
有操作页面
面向用户友好的简单操作界面,非常方便的管理Bucket及里面的文件资源
-
功能简单
这一设计原则让MinIO不容易出错、更快启动
-
丰富的API
支持文件资源的分享连接及分享链接的过期策略、存储桶操作、文件列表访问及文件上传下载的基本功能等。
-
文件变化主动通知
存储桶(Bucket)如果发生改变,比如上传对象和删除对象,可以使用存储桶事件通知机制进行监控,并通过以下方式发布出去:AMQP、MQTT、Elasticsearch、Redis、NATS、MySQL、Kafka、Webhooks等。
一、安装启动
我采用的是docker安装
docker pull minio/minio
创建配置文件目录和上传目录
mkdir -p /home/minio/config
mkdir -p /home/minio/data
启动容器
docker run -p 9000:9000 -p 9090:9090 \
--net=host \
--name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=admin" \
-e "MINIO_SECRET_KEY=admin123456" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio \
minio/minio server \
/data --console-address ":9090" -address ":9000"
假设我们的服务器地址为http://192.168.200.100:9000,我们在地址栏输入:http://http://192.168.200.100:9000/ 即可进入登录界面。
Access Key为admin ,Secret_key 为admin123456进入系统后可以看到主界面
一、快速入门
创建springboot项目
1 导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
在配置文件中导入
minio:
accessKey: admin
secretKey: admin123456
bucket: text
endpoint: http://192.168.200.100:9000
readPath: http://192.168.200.100:9000
2 配置类
MinIOProperties
@Configuration
@Data
@ConfigurationProperties(prefix = "minio")
public class MinIOProperties {
private String accessKey;
private String secretKey;
private String bucket;
private String endpoint;
private String readPath;
}
MinIOClientConfig
@Data
@Primary
@Configuration
public class MinIOClientConfig {
@Autowired
private MinIOProperties minIOProperties;
@Bean
public MinioClient buildMinioClient(){
return MinioClient
.builder()
.credentials(minIOProperties.getAccessKey(), minIOProperties.getSecretKey())
.endpoint(minIOProperties.getEndpoint())
.build();
}
}
3 开始业务
Controller
@RestController
@RequestMapping("minio")
public class UploadController {
@Autowired
private FileService fileService;
@PostMapping("/upload")
public String uploadMinio(@RequestPart("file") MultipartFile file) {
return fileService.uploadMinio(file);
}
}
Service
public interface FileService {
public String uploadMinio(MultipartFile file) ;
}
ServiceImpl
@Slf4j
@Service
public class FileServiceImpl implements FileService {
@Autowired
private MinioClient minioClient;
@Autowired
private MinIOProperties minioProperties;
@Override
public String uploadMinio(MultipartFile file) {
System.out.println(minioProperties);
try {
// 判断桶是否存在
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioProperties.getBucket()).build());
if (!found) { // 如果不存在,那么此时就创建一个新的桶
minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucket()).build());
} else { // 如果存在打印信息
System.out.println("Bucket 'daijia' already exists.");
}
// 设置存储对象名称
String extFileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String fileName = new SimpleDateFormat("yyyyMMdd")
.format(new Date()) + "/" + UUID.randomUUID().toString().replace("-" , "") + "." + extFileName;
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.bucket(minioProperties.getBucket())
.stream(file.getInputStream(), file.getSize(), -1)
.object(fileName)
.build();
minioClient.putObject(putObjectArgs) ;
return minioProperties.getEndpoint() + "/" + minioProperties.getBucket() + "/" + fileName ;
} catch (Exception e) {
e.printStackTrace();
}
return "error";
}
}
4 测试
点击连接,就可以开始下载图片
如果发现图片报错,去控制台把Access Policy 改成Pubilc
完成。
不用web的方式也可以上传图片:
Service
public interface FileStorageService {
/**
* 上传图片文件
* @param prefix 文件前缀
* @param filename 文件名
* @param inputStream 文件流
* @return 文件全路径
*/
public String uploadImgFile(String prefix, String filename,InputStream inputStream);
/**
* 删除文件
* @param pathUrl 文件全路径
*/
public void delete(String pathUrl);
}
ServiceImpl
@Slf4j
@Service
public class MinIOFileStorageServiceImpl implements FileStorageService {
@Autowired
private MinioClient minioClient;
@Autowired
private MinIOProperties minIOConfigProperties;
private final static String separator = "/";
/**
* 上传图片文件
* @param prefix 文件前缀
* @param filename 文件名
* @param inputStream 文件流
* @return 文件全路径
*/
@Override
public String uploadImgFile(String prefix, String filename, InputStream inputStream) {
String filePath = builderFilePath(prefix, filename);
try {
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.object(filePath)
.contentType("image/jpg")
.bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)
.build();
minioClient.putObject(putObjectArgs);
StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
urlPath.append(separator+minIOConfigProperties.getBucket());
urlPath.append(separator);
urlPath.append(filePath);
return urlPath.toString();
}catch (Exception ex){
log.error("minio put file error.",ex);
throw new RuntimeException("上传文件失败");
}
}
/**
* 删除文件
* @param pathUrl 文件全路径
*/
@Override
public void delete(String pathUrl) {
String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/","");
int index = key.indexOf(separator);
String bucket = key.substring(0,index);
String filePath = key.substring(index+1);
// 删除Objects
RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
try {
minioClient.removeObject(removeObjectArgs);
} catch (Exception e) {
log.error("minio remove file error. pathUrl:{}",pathUrl);
e.printStackTrace();
}
}
}
测试类:
@SpringBootTest
class MinioDemoApplicationTests {
@Autowired
private MinIOFileStorageServiceImpl minIOFileStorageServiceImpl;
@Test
void imageFileStorage() throws IOException {
String fileName = UUID.randomUUID().toString().replaceAll("-", "");
String path = minIOFileStorageServiceImpl.uploadImgFile("text", fileName, Files.newInputStream(new File("D:\\图片\\1.jpg").toPath()));
System.out.println(path);
}
@Test
void deleteImageFile() throws IOException {
minIOFileStorageServiceImpl.delete("");//这里填上传的文件路径
}
}
完成。
标签:文件,存储,String,入门,private,MinIO,file,public,minio From: https://blog.csdn.net/2301_81717523/article/details/143090825