对象存储服务MinIO快速入门(集成项目的详细过程)
作者:二本也有大厂梦
对象存储服务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/configmkdir -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("");//这里填上传的文件路径 } }
完成。
到此这篇关于对象存储服务MinIO快速入门(集成项目的详细过程)的文章就介绍到这了,更多相关对象存储服务MinIO内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!