还在用FastDFS?快来试试MinIO
最近在做一个项目,需要用到文件服务做文件存储和共享,之前就听说过MinIO,一直没尝试过,用过给我最大的感受就是部署真是方便了,提供了一个UI界面,操作很方便,发现真香
什么是MinIO
具体介绍看网站介绍MinIO | 高性能, Kubernetes 原生对象存储
安装部署
安装部署比较简单,可以用docker也可以下载安装包,我这里用ubuntu,官网地址比较慢,用中国的镜像站,MinIO中国加速站的使用用办法:将官网下载地址中的dl.min.io改为dl.minio.org.cn下载安装包安装minio启动minio服务,设置文件存储路径为:/opt/minio/data ,并设置UI控制台端口号9001,注意MinIO服务端口默认为9000,客户端接入时连接端口是9000,别成控制台端口9001 wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio_20230227181045.0.0_amd64.deb dpkg -i minio_20230227181045.0.0_amd64.deb sudo nohup minio server /opt/minio/data --console-address ":9001" 2>&1 &
启动后,通过浏览器访问127.0.0.1:9001,可以进入控制台,默认用户和密码是minioadmin
MinIO控制台
那怎么传文件了?首先,创建一个Bucket(存储桶),然后选择这个bucket可以上传了,bucket可以理解为一个容器,文件放在bucket里,可以按需建,比如不同类型或者不同模块的文件,放在不同的bucket里,这里创建一个public的bucket
bucket创建好之后,就可以往bucket里上传文件了
上传后,点击文件可以下载、在线预览,分享,删除
配置密钥,客户端接入时使用
SpringBoot集成MinIO
前面介绍MinIO的一些基本操作,下面来通过代码来演示,springboot怎么集成MinIO
首先创建maven项目,引入MinIO的客户端 io.minio minio 8.5.2
在配置文件里添加MinIO的接入参数minio: #minio服务地址 endpoint: http://192.168.19.130:9000 #认证 accessKey: jDLyzTvkq3HsKleF #认证密钥 secretKey: n3QC5VYcicQGPqKQVYksZalkBRZxUDSa #默认存储桶 bucket: public
添加MinIO配置类@Configuration public class MinioConfig { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; @Bean public MinioClient minioClient() { return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } }
编写MinIO工具类 @Component public class MinioHelper { @Value("${minio.bucket}") private String defaultBucketName; @Autowired private MinioClient minioClient; /** * 存储桶是否存在 * * @param bucketName 存储桶名字 * @return */ public boolean bucketExists(String bucketName) { try { return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); } catch (Exception e) { e.printStackTrace(); } return false; } /** * 创建bucket * * @param bucketName 存储桶名字 */ public boolean createBucket(String bucketName) { try { if (!bucketExists(bucketName)) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } return true; } catch (Exception e) { e.printStackTrace(); } return false; } /** * 删除bucket * * @param bucketName 存储桶名字 * @return */ public boolean removeBucket(String bucketName) { try { if (!bucketExists(bucketName)) { minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); return true; } } catch (Exception e) { e.printStackTrace(); } return false; } /** * 上传文件 * * @param bucketName 存储桶名字 * @param inputStream 输入流 * @param filePath 文件路径,可以是文件名,也可以带上需要存储的路径,例如年月 2023/03/upload.txt * @return true成功false失败 */ public ObjectWriteResponse upload(String bucketName, InputStream inputStream, String filePath) { if (StringUtils.isBlank(bucketName)) { bucketName = defaultBucketName; } createBucket(bucketName); try { return minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(filePath).stream(inputStream, inputStream.available(), -1).build()); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 下载文件 * * @param bucketName 存储桶名字 * @param filePath 文件路径 * @return 文件输入流 */ public InputStream download(String bucketName, String filePath) { try { if (StringUtils.isBlank(bucketName)) { bucketName = defaultBucketName; } return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(filePath).build()); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 删除文件 * * @param bucketName 存储桶名字 * @param filePath 文件路径 * @return true成功false失败 */ public boolean removeFile(String bucketName, String filePath) { try { if (StringUtils.isBlank(bucketName)) { bucketName = defaultBucketName; } minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(filePath).build()); return true; } catch (Exception e) { e.printStackTrace(); } return false; } /** * 列出存储桶里所有文件,包括文件夹中的子文件 * * @param bucketName 存储桶名字 * @return 文件列表 */ public Iterable> list(String bucketName) { return minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).recursive(true).build()); } }
编写测试用例,进行测试@SpringBootTest public class MinioHelperTest { @Autowired MinioHelper minioHelper; @Test void createBucket() { minioHelper.createBucket("test"); } @Test void removeBucket() { minioHelper.removeBucket("test"); } @Test void upload() throws FileNotFoundException { FileInputStream fileInputStream = new FileInputStream("C:minioupload.png"); minioHelper.upload("public", fileInputStream, "2023/03/upload.png"); } @Test void download() throws IOException { InputStream inputStream = minioHelper.download("public", "2023/03/upload.png"); FileOutputStream outputStream = new FileOutputStream("d:upload.png"); outputStream.write(IOUtils.toByteArray(inputStream)); } @Test void removeFile() { minioHelper.removeFile("public", "2023/03/upload.png"); } @Test void list() throws Exception { Iterable> iterable = minioHelper.list("public"); for (Result- result : iterable) { System.out.println("result = " + result.get().objectName()); } } }
全文结束,谢谢阅读,用你发财的小手,点赞收藏吧!
我们生活的现实世界是被模拟出来的虚拟世界?细思极恐光速,每秒30万公里,确实很快。但无论有多快,光速毕竟是有限的,而有限的光速也决定了我们看到的任何事物其实都是他们的过去时,我们看到的都是过去已经发生的情景。这点很好理解,比如说,
如何用互联网思维让馒头店上市?卖馒头很简单,一个买一个卖,一手交钱一手交货,最基本的商业模式就形成了,但如果是用互联网思维,比如馒头本身不能收费又或者没有中间商赚差价,会出现怎样的奇观?一起来看看!所谓互联网思
OK镜首次被纳入集采多家公司回应北京商报讯(记者姚倩)10月27日早盘,眼科概念股集体重挫。消息面上,河北省医用药品器械采购中心发布通知,该省拟于近期开展20种医用耗材集中带量采购,组织开展信息填报工作。热门高毛
广东省东莞市麻涌镇骑迹水乡品味丰收之旅古梅乡韵令人沉醉原标题广东省东莞市麻涌镇骑迹水乡品味丰收之旅(引题)古梅乡韵令人沉醉(主题)中国文化报驻广东记者谭志红金秋时节,广东省东莞市麻涌镇又到了收获的季节,金黄饱满的稻谷透着香甜的甘蔗油润
10月26日收评3000点保卫战与昨天其实没有太大的区别,这里说实话再分析盘面和基本面其实已经没有什么意义,3000点以下,几乎所有的板块都超跌,只要大盘能企稳,基本都会有反弹需要的。记住3000点以下套也要套在
拒绝中国设计或制造的芯片?传微软戴尔已要求供应链整理清单10月26日消息,据中国台湾工商时报,近期业界传出消息称,美国厂商微软戴尔率先要求供应链整理清单,详列列出使用中的半导体有哪些来自中国大陆芯片设计公司哪些芯片由中国大陆晶圆代工厂生
6亿u被爆仓,10万人是受害者今天有6亿u被爆仓了,有一半是二饼太子哥的hy,看了下详细数据,多半都是开空被爆了。所以为什么我看空的时候总是会提前平了看情况再追呢,因为趋势是随时会产生变化的,千万不可以太自信的
莆田地区人类活动史逾2万年,木兰溪流域考古有新发现你知道吗?木兰溪流域考古调查有新发现莆田地区人类活动史逾2万年一起来看看吧木兰溪流域遗址分布图众多史前文化遗址的发现,佐证木兰溪流域是福建地区古人类活动较为频繁的区域,也是南北史前
从曾经狂胜山东男篮49分到如今惨败!上海男篮到底怎么了?北京时间10月25日晚,CBA联赛迎来山东男篮与上海男篮的问题对决。结果,在仅仅9个月前,还可以大比分轻松战胜山东男篮的上海队,很快就败下阵来,三节战罢,就已经落后24分,整个第四
当今胖子的中医辩证当前,由于生活水平的迅速提高,丰富的饮食让人措手不及,大家吃起来是随心所欲,最终出现了大量肥胖的人群,随之,高血压高血脂及高血糖的三高患者如雨后春笋般的涌了出来,体重增加是危害人们
吃完饭就开始犯困,是大脑供血不足?自查,可能是这2个原因春困秋乏在部分人身上体现得很明显,会随着季节变化身体有不一样的改变。春季,秋季等大多气候适宜,环境良好,在这种状态下人更容易犯困。不过,有的人表现为吃完饭就犯困,想要睡觉,有这种表