还在用FastDFS?快来试试MinIO
最近在做一个项目,需要用到文件服务做文件存储和共享,之前就听说过MinIO,一直没尝试过,用过给我最大的感受就是部署真是方便了,提供了一个UI界面,操作很方便,发现真香
什么是MinIO
具体介绍看网站介绍MinIO高性能,Kubernetes原生对象存储
安装部署
安装部署比较简单,可以用docker也可以下载安装包,我这里用ubuntu,官网地址比较慢,用中国的镜像站,MinIO中国加速站的使用用办法:将官网下载地址中的dl。min。io改为dl。minio。org。cn下载安装包安装minio启动minio服务,设置文件存储路径为:optminiodata,并设置UI控制台端口号9001,注意MinIO服务端口默认为9000,客户端接入时连接端口是9000,别成控制台端口9001wgethttps:dl。minio。org。cnserverminioreleaselinuxamd64minio20230227181045。0。0amd64。debdpkgiminio20230227181045。0。0amd64。debsudonohupminioserveroptminiodataconsoleaddress:900121
启动后,通过浏览器访问127。0。0。1:9001,可以进入控制台,默认用户和密码是minioadmin
MinIO控制台
那怎么传文件了?首先,创建一个Bucket(存储桶),然后选择这个bucket可以上传了,bucket可以理解为一个容器,文件放在bucket里,可以按需建,比如不同类型或者不同模块的文件,放在不同的bucket里,这里创建一个public的bucket
bucket创建好之后,就可以往bucket里上传文件了
上传后,点击文件可以下载、在线预览,分享,删除
配置密钥,客户端接入时使用
SpringBoot集成MinIO
前面介绍MinIO的一些基本操作,下面来通过代码来演示,springboot怎么集成MinIO
首先创建maven项目,引入MinIO的客户端dependencygroupIdio。miniogroupIdminioartifactIdversion8。5。2versiondependency
在配置文件里添加MinIO的接入参数minio:minio服务地址endpoint:http:192。168。19。130:9000认证accessKey:jDLyzTvkq3HsKleF认证密钥secretKey:n3QC5VYcicQGPqKQVYksZalkBRZxUDSa默认存储桶bucket:public
添加MinIO配置类ConfigurationpublicclassMinioConfig{Value({minio。endpoint})privateStringendpoint;Value({minio。accessKey})privateStringaccessKey;Value({minio。secretKey})privateStringsecretKey;BeanpublicMinioClientminioClient(){returnMinioClient。builder()。endpoint(endpoint)。credentials(accessKey,secretKey)。build();}}
编写MinIO工具类ComponentpublicclassMinioHelper{Value({minio。bucket})privateStringdefaultBucketName;AutowiredprivateMinioClientminioClient;存储桶是否存在parambucketName存储桶名字returnpublicbooleanbucketExists(StringbucketName){try{returnminioClient。bucketExists(BucketExistsArgs。builder()。bucket(bucketName)。build());}catch(Exceptione){e。printStackTrace();}returnfalse;}创建bucketparambucketName存储桶名字publicbooleancreateBucket(StringbucketName){try{if(!bucketExists(bucketName)){minioClient。makeBucket(MakeBucketArgs。builder()。bucket(bucketName)。build());}returntrue;}catch(Exceptione){e。printStackTrace();}returnfalse;}删除bucketparambucketName存储桶名字returnpublicbooleanremoveBucket(StringbucketName){try{if(!bucketExists(bucketName)){minioClient。removeBucket(RemoveBucketArgs。builder()。bucket(bucketName)。build());returntrue;}}catch(Exceptione){e。printStackTrace();}returnfalse;}上传文件parambucketName存储桶名字paraminputStream输入流paramfilePath文件路径,可以是文件名,也可以带上需要存储的路径,例如年月202303upload。txtreturntrue成功false失败publicObjectWriteResponseupload(StringbucketName,InputStreaminputStream,StringfilePath){if(StringUtils。isBlank(bucketName)){bucketNamedefaultBucketName;}createBucket(bucketName);try{returnminioClient。putObject(PutObjectArgs。builder()。bucket(bucketName)。object(filePath)。stream(inputStream,inputStream。available(),1)。build());}catch(Exceptione){e。printStackTrace();}returnnull;}下载文件parambucketName存储桶名字paramfilePath文件路径return文件输入流publicInputStreamdownload(StringbucketName,StringfilePath){try{if(StringUtils。isBlank(bucketName)){bucketNamedefaultBucketName;}returnminioClient。getObject(GetObjectArgs。builder()。bucket(bucketName)。object(filePath)。build());}catch(Exceptione){e。printStackTrace();}returnnull;}删除文件parambucketName存储桶名字paramfilePath文件路径returntrue成功false失败publicbooleanremoveFile(StringbucketName,StringfilePath){try{if(StringUtils。isBlank(bucketName)){bucketNamedefaultBucketName;}minioClient。removeObject(RemoveObjectArgs。builder()。bucket(bucketName)。object(filePath)。build());returntrue;}catch(Exceptione){e。printStackTrace();}returnfalse;}列出存储桶里所有文件,包括文件夹中的子文件parambucketName存储桶名字return文件列表publicIterableResultItemlist(StringbucketName){returnminioClient。listObjects(ListObjectsArgs。builder()。bucket(bucketName)。recursive(true)。build());}}
编写测试用例,进行测试SpringBootTestpublicclassMinioHelperTest{AutowiredMinioHelperminioHelper;TestvoidcreateBucket(){minioHelper。createBucket(test);}TestvoidremoveBucket(){minioHelper。removeBucket(test);}Testvoidupload()throwsFileNotFoundException{FileInputStreamfileInputStreamnewFileInputStream(C:minioupload。png);minioHelper。upload(public,fileInputStream,202303upload。png);}Testvoiddownload()throwsIOException{InputStreaminputStreamminioHelper。download(public,202303upload。png);FileOutputStreamoutputStreamnewFileOutputStream(d:upload。png);outputStream。write(IOUtils。toByteArray(inputStream));}TestvoidremoveFile(){minioHelper。removeFile(public,202303upload。png);}Testvoidlist()throwsException{IterableResultItemiterableminioHelper。list(public);for(ResultItemresult:iterable){System。out。println(resultresult。get()。objectName());}}}
全文结束,谢谢阅读,用你发财的小手,点赞收藏吧!
为什么三星手机没落了?感谢您的阅读!有人说三星手机没落了。我并不认为三星手机没落,只不过三星手机在发展过程中,它确实承受着很大的压力,这种压力主要是在国内手机市场。你要知道三星在国际市场,它目前的表现依
用电子血压计测试血压,测左侧还是右侧最准确?谁量的血压最准确?医生护士还是自己?医生学识更丰富,护士量血压经验更多,很多人选择的答案是医生或者护士,但正确的答案可能出乎大家意料,是患者本人在家量的血压最准确。因为很多患者到了
得了乳腺癌看不开怎么办?得了乳腺癌一定要开看点,目前乳腺癌的治愈率越来越高,治疗方法也有很多,某种程度上说,乳腺癌已成为慢性病。我是一名乳腺癌患者,2018年确诊,当时一下子接受不了,因为我想不明白为什么
郴州市苏仙区第二幼儿园开展足球特色活动红网时刻新闻3月27日讯(通讯员肖娟)足球是孩子们的好伙伴,为了让足球更好地走进幼儿园,让孩子们和足球快乐游戏,打造全国足球特色示范幼儿园,推动校园足球运动的发展,让更多的幼儿享受
勇士消息裁判报告两得利,格林言论惹争议,战鹈鹕出场更新北京时间3月28日,远在大洋彼岸的金州勇士传来了3条消息,一起来看看吧。裁判报告两得利昨日,勇士坐镇主场对阵森林狼,最终经过4节激战,勇士9699不敌对手,三连胜被终结。不过有些球
默森英格兰有机会赢得欧洲杯世界杯凯恩能为英格兰进80球直播吧3月28日讯天空体育的嘉宾保罗默森谈到英格兰队的欧洲杯情况,他表示英格兰队是一个巨大的威胁,不明白为什么人们一直说索斯盖特可能会完蛋,在质疑索斯盖特的未来时,英格兰应该审视他
文班亚马花落谁家火箭倒三基本确定了!因为火箭追上黄蜂只存在理论可能。所以火箭抽到文班亚马的概率锁定在1214联盟倒数第四的黄蜂双杀独行侠,宣告火箭马刺活塞联盟倒三的位置已经稳固。黄蜂目前已经达到2
安妞酸了!梅西南美足联颁奖与美女歌手牵手,女神深情献唱球王娇羞3月28日消息,当地时间3月27日,南美足联举行了庆祝阿根廷夺冠的庆典仪式,梅西率领阿根廷队全队出席。南美足联特意为梅西制作了一个几乎和他等大的蜡像,并且送给梅西一根魔法棒。最有趣
有没有特别会夸人的句子?1。头发往后倒,一看就是大领导。2。头发一边扒,一看就是企业家。3。人美头发长,一看就是老板娘。4。人美头发短,一看就是大老板。5。人美嘴巴甜,一看就是不差钱。6。人帅又有爱,一看
名爵领航的车内空间大吗?名爵领航的空间还是非常大的,一体式的桶式座椅造型非常运动,后排坐三人也非常舒适。这个车的空间是比较宽敞实用,然后尾箱的空间比较宽敞,可以放下大件的那些柜子和箱子等行李物品,比较符合
广东的原味汤粉王怎么做?广东的原味汤粉属于潮汕地区的传统小食,河粉在潮汕俗称粿条,以清淡鲜美为特色。在广东的大街小巷随处可见的原味汤粉店,生意都很火爆。原味汤粉的好吃关键在于汤,好的高汤都是采用猪筒骨鸡骨