使用Java Minio搭建自己的文件系統(tǒng)詳解
前言
最近接了一個(gè)項(xiàng)目,甲方不愿意買服務(wù)器,但是呢,項(xiàng)目又必須要用文件功能。所以很巧,最近又剛好看到了Minio這個(gè)牛逼的工具。正好借此機(jī)會(huì)記錄下來此次操作的全部流程。
本次涉及到的功能有:
- Minio的安裝與啟動(dòng)
- 控制臺(tái)的使用以及存儲(chǔ)桶的創(chuàng)建
- 存儲(chǔ)桶的使用權(quán)限說明
- 使用控制臺(tái)實(shí)現(xiàn)文件上傳與下載
- (重點(diǎn))使用Springboot與Minio整合實(shí)現(xiàn)文件的增刪改查
本次使用環(huán)境:Centos7.6+finalshell+java
1、Minio介紹
如果你聽過這個(gè),那么你直接跳到第二小節(jié)看使用說明。如果你不知道這個(gè),但是你最近也正在找一款文件存儲(chǔ)的工具,那么你可以先看看這個(gè)的介紹。
Minio 是一個(gè)基于Go語言的對(duì)象存儲(chǔ)服務(wù)。它實(shí)現(xiàn)了大部分亞馬遜S3云存儲(chǔ)服務(wù)接口,可以看做是是S3的開源版本,非常適合于存儲(chǔ)大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機(jī)鏡像等,而一個(gè)對(duì)象文件可以是任意大小,從幾kb到最大5T不等。區(qū)別于分布式存儲(chǔ)系統(tǒng),minio的特色在于簡單、輕量級(jí),對(duì)開發(fā)者友好。
阿里云對(duì)象存儲(chǔ)你應(yīng)該清楚,這個(gè)和OSS的區(qū)別就是,OSS收費(fèi),這個(gè)是你自己搭建的,不收費(fèi),只占磁盤大小。其他的功能都是一毛一樣的。
2、Minio安裝與啟動(dòng)
首先,我們得先去找到下載地址
- 下載地址:
https://dl.min.io/server/minio/release/linux-amd64/minio
使用我們的終端工具連接上我們的服務(wù)器。
步驟:
1.找一個(gè)目錄,用來存放我們的minio文件
2.使用wget命令,通過下載地址下載下載我們的文件
wget https://dl.min.io/server/minio/release/linux-amd64/minio
3.給minio這個(gè)文件賦予權(quán)限,作為文件啟動(dòng)
chmod +x minio
4.使用./minio server start
啟動(dòng)
當(dāng)你能看到這個(gè)界面的時(shí)候,說明你就成功了。
小提示1:
下面的兩個(gè)紅色的并不是報(bào)錯(cuò),而是警告,也可以是一個(gè)建議。
第一句翻譯:控制臺(tái)斷點(diǎn)的偵聽端口并不是固定的,請(qǐng)使用 --console-address指定端口啟動(dòng)
第二句翻譯:默認(rèn)初始憑證賬號(hào)和密碼是minioadmin和minioadmin 你可以在環(huán)境變量中去更改他。但是我這兒就不修改了,如果你想修改你可以去profile下面使用export命名來加上他說的那個(gè)變量名來指定賬號(hào)和密碼。
小提示2:
如果你是本地虛擬機(jī),啟動(dòng)后只需要使用ip:9000端口來實(shí)現(xiàn)訪問,如果訪問不了,請(qǐng)關(guān)掉防火墻,命令:
systemctl stop firewalld
如果你是云服務(wù)器,請(qǐng)放行9000端口和他提示出來的端口。9000作為API端口是不變的,但是你同樣可以指定修改他,控制臺(tái)端口經(jīng)過我自己測試,他每次啟動(dòng)都會(huì)發(fā)生改變,所以我們還是建議使用指定端口啟動(dòng)。
小提示3:
我們上面的啟動(dòng)命令,他啟動(dòng)好了之后日志可以指定到目錄去存儲(chǔ),只需要將./minio server start 命令更換成 ./minio server /home/minio/data 其中/home/minio/data是我自己定義的目錄,你可以隨便定義。
第二:啟動(dòng)后會(huì)占用控制臺(tái),我們也可以將他調(diào)整成為后臺(tái)啟動(dòng),加上指定的端口,我們就可以完成自定義的設(shè)置。具體啟動(dòng)命令如下:
nohup ./minio server --console-address ':41169' /home/minio/data/ > /home/minio/data/minio.log 2>&1 &
意思就是,指定控制臺(tái)端口為41169,并且生成日志文件到/home/minio/data目錄下的minio.log中
訪問ip:9000進(jìn)入登錄界面 使用默認(rèn)賬號(hào)進(jìn)行登錄
3、Minio控制臺(tái)創(chuàng)建存儲(chǔ)桶
這樣就創(chuàng)建好了我們的存儲(chǔ)桶。
4、存儲(chǔ)桶權(quán)限
在創(chuàng)建好存儲(chǔ)桶之后,我們?yōu)榱耸褂眠h(yuǎn)程連接來訪問使用。所以有必要去修改一下存儲(chǔ)桶的權(quán)限。
我們點(diǎn)擊最下面的那個(gè)Rules,然后點(diǎn)擊右上角創(chuàng)建一個(gè)訪問規(guī)則??梢允褂镁珳?zhǔn)匹配,也可以使用通配符。
前綴我們使用* 這樣可以匹配全部訪問用戶,下面的權(quán)限我們使用讀寫。
5、控制臺(tái)實(shí)現(xiàn)文件的上傳與下載
我們點(diǎn)到左邊的功能欄,然后選擇右邊我們剛創(chuàng)建的存儲(chǔ)桶。然后,,我覺得接下來的操作我都不用細(xì)說你們應(yīng)該都會(huì)玩了。
同樣,在上傳成功后,也提供下載與預(yù)覽功能。
6、使用Springboot與Minio整合實(shí)現(xiàn)文件的增刪查改
6.1、創(chuàng)建項(xiàng)目
略
6.2、添加依賴
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>6.0.11</version> </dependency>
6.3、創(chuàng)建自定義屬性與配置類
minio: accesskey: minioadmin secretkey: minioadmin url: http://ip:9000 bucketname: zxy-images
@Component @Data public class MinioProperties { /** * API調(diào)用地址 */ @Value("${minio.url}") private String url; /** * 連接賬號(hào) */ @Value("${minio.accesskey}") private String accessKey; /** * 連接秘鑰 */ @Value("${minio.secretkey}") private String secretKey; }
@Configuration @Slf4j public class MinioConfig { @Resource private MinioProperties minioProperties; @Bean public MinioClient getMinioClient(){ try { return new MinioClient(minioProperties.getUrl(), minioProperties.getAccessKey(), minioProperties.getSecretKey()); } catch (InvalidEndpointException | InvalidPortException e) { e.printStackTrace(); log.info("-----創(chuàng)建Minio客戶端失敗-----"); return null; } } }
6.4、功能實(shí)現(xiàn)
6.4.1、文件上傳
public void upload(MultipartFile file) throws IOException, XmlPullParserException, NoSuchAlgorithmException, InvalidKeyException, InvalidArgumentException, InvalidResponseException, InternalException, NoResponseException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException { if (file == null || file.getSize() == 0 || file.isEmpty()) { throw new RuntimeException("上傳文件為空,請(qǐng)重新上傳"); } // 獲取文件名 String filename = file.getOriginalFilename(); assert filename != null; /* 像下面這樣寫最主要是為了用來做分割,同時(shí)也保證文件名是唯一的 */ String newFilename = UUID.randomUUID().toString() + "|" + filename + filename.substring(filename.lastIndexOf(".")); minioClient.putObject(bucketName, newFilename, file.getInputStream(), file.getSize(), null, null, file.getContentType()); }
6.4.2、文件下載
public InputStream download(String fileName, HttpServletResponse response) { InputStream inputStream = null; // 根據(jù)文件名拿到minio中的文件對(duì)象 try { ObjectStat object = minioClient.statObject(bucketName, fileName); // 設(shè)置響應(yīng)頭類型 response.setContentType(object.contentType()); inputStream = minioClient.getObject(bucketName, fileName); } catch (Exception e) { e.printStackTrace(); } return inputStream; }
6.4.3、查詢?nèi)课募?/h4>
public Iterable<Result<Item>> listObjects() {
try {
return minioClient.listObjects(bucketName);
} catch (XmlPullParserException e) {
e.printStackTrace();
}
return null;
}
public Iterable<Result<Item>> listObjects() { try { return minioClient.listObjects(bucketName); } catch (XmlPullParserException e) { e.printStackTrace(); } return null; }
6.4.4、刪除指定文件
public void deleteFile(String fileName){ try { minioClient.removeObject(bucketName,fileName); } catch (Exception e) { e.printStackTrace(); } }
總結(jié)
其實(shí)操作并不難,你如果發(fā)現(xiàn)了我的操作全都是使用的minioClient來實(shí)現(xiàn)的時(shí)候,你的重心就應(yīng)該去放在這個(gè)類上面,里面所有的方法都有注釋,看一遍就能學(xué)會(huì)。
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java編程Iterator迭代器設(shè)計(jì)原理及實(shí)現(xiàn)代碼示例
這篇文章主要介紹了Java編程Iterator迭代器設(shè)計(jì)原理及實(shí)現(xiàn)代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10maven如何利用springboot的配置文件進(jìn)行多個(gè)環(huán)境的打包
這篇文章主要介紹了maven如何利用springboot的配置文件進(jìn)行多個(gè)環(huán)境的打包,在Spring Boot中多環(huán)境配置文件名需要滿足application-{profiles.active}.properties的格式,其中{profiles.active}對(duì)應(yīng)你的環(huán)境標(biāo)識(shí),本文給大家詳細(xì)講解,需要的朋友可以參考下2023-02-02java面向?qū)ο?API(接口)與集合(ArrayList)
這篇文章主要介紹了Java語言面向?qū)ο蟮腁PI與集合,還是十分不錯(cuò)的,這里給大家分享下,需要的朋友可以參考,希望能夠給你帶來幫助2021-08-08spring中@Autowired自動(dòng)注入依賴項(xiàng)的使用
當(dāng)使用@Autowired注解時(shí),它可以自動(dòng)注入依賴項(xiàng),例如其他類的實(shí)例,本文就來詳細(xì)的介紹一下,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09nodejs連接dubbo服務(wù)的java工程實(shí)現(xiàn)示例
這篇文章主要介紹了在項(xiàng)目遷移中,nodejs連接dubbo服務(wù)的java工程實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Spring自定義注解的實(shí)現(xiàn)與使用方式
注解是Java中用于類、方法、參數(shù)、包的裝飾標(biāo)志,本身不具備功能,但可定義參數(shù),Java包含內(nèi)建注解和元注解,如@Target、@Retention等,描述注解的使用范圍和生命周期,Spring的AOP(面向切面編程)可以結(jié)合注解實(shí)現(xiàn)功能,如權(quán)限控制和日志記錄2024-09-09