第一步、檢查環境
環境爲centOS7
可連接網絡,可使用ping www.baidu.com 進行檢查
支持wget命令,如果不支持可以使用以下命令安裝:
yum -y install wget
注意使用root帳號,yum命令也是需要聯網的。
一切就緒。
第二步、安裝部署
官方地址有說明,可以查看官方網址
首先,使用root帳號登錄
執行命令行如下:
wget https://dl.min.io/server/minio/release/linux-amd64/minio
這個時間比較耗時,因爲連接的國外網站,請耐心等待。
下載完成後,分配權限,執行命令行如下:
chmod +x minio
這個時候可以通過ls命令看到minio文件顏色由原來的白色邊成綠色了
接下來我們把minio文件移動到指定的文件夾中,執行命令如下:
mv minio /usr/bin
進入到usr/bin目錄下查看是否存在該文件
接下來回到根目錄,並創建一個用來存放minio系統文件的文件,執行命令如下:
mkdir /mnt/minio-data
接下來,請使用目錄回到根目錄
啓動Minio,執行命令如下:
./minio server /mnt/minio-data
意思就是啓動minio服務並且將生成的系統文件放到 /mnt/minio-data目錄下。
這個時候控制檯會輸出一部分內容:
[root@node1 ~]# ./minio server /mnt/minio-data
Endpoint: http://1***我的IP:9000 http://10.0.2.15:9000 http://172.17.0.1:9000 http://127.0.0.1:9000
AccessKey: minioadmin
SecretKey: minioadmin
Browser Access:
http://1***我的IP:9000 http://10.0.2.15:9000 http://172.17.0.1:9000 http://127.0.0.1:9000
Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
注意AccessKey和SecretKey兩個內容,是用來登錄Mini的管理後臺的。
這個時候啓動成功了,接下來可以訪問了,打開瀏覽器,訪問linux所在IP的地址,端口號爲9000
如果訪問失敗,有可能是防火牆沒有開放,可以檢查端口號9000狀態是不是off,如果是,需要開放端口號,開放端口號的命令如下:
/sbin/iptables -I INPUT -p tcp --dport 9000 -j ACCEPT
再次用瀏覽器訪問9000端口,成功訪問,效果如下圖:
輸入剛纔控制檯輸出的AccessKey和SecretKey內容即可登錄,如圖:
上圖中的test是我創建好的一個存儲桶,點擊圖中的“+”號可以創建存儲桶,其實就是一個文件夾,用來存放上傳的文件的。
這個時候基本上可以正常使用了。但是存在一個問題,如果控制檯關閉了,那麼服務也就關了,如何後臺運行呢?
命令行執行,將Minio設置爲後臺執行,root帳號進入到根目錄,執行命令如下:
nohup ./minio server /mnt/minio-data >/mnt/minio-data/minio_service.log &
將minio設置爲後臺運行並輸出Log日誌。
這個時候關閉控制檯,再次使用瀏覽器訪問9000端口測試即可,如果正常訪問說明設置成功。
這個時候依然存在風險,服務器斷電關機了怎麼辦?
需要開機重啓,接下來編輯開機重啓的腳本。
root帳號登錄後,在home目錄下創建一個sh文件:
vim /home/minioSysInit.sh
意思是創建一個minioSysInit.sh文件並直接進入編輯狀態,
將下面的內容放進去:
# !/bin/bash
nohup ./minio server /mnt/minio-data >/mnt/minio-data/minio_service.log &
然後保存退出
接下來給該sh文件賦權限:
chmod +x /home/minioSysInit.sh
接下來編輯啓動系統文件,執行命令:
vim /etc/rc.d/rc.local
將剛纔的sh文件添加進去:
# 開機自啓動Minio,此處修改爲腳本位置
/home/minioSysInit.sh
OK,搞定。
web項目使用
添加項目依賴
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>6.0.11</version>
</dependency>
注意是6.0.11,官方給的是3.+的,比較坑。
如果你是springboot項目可能會存在guava衝突,應該會多出來一個2.0的jar包,去除一個即可。
個人基於minio搭建了一層管理項目,可直接下載下來使用,開放了公共上傳接口,可通過postman測試:http://localhost/oss/ossMinioFile/upload
項目下載地址:點擊這裏
添加依賴後就可以直接使用了,參考代碼:
package com.ruoyi.common.utils.oss;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import io.minio.MinioClient;
import io.minio.Result;
import io.minio.errors.*;
import io.minio.messages.Item;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
/**
* @ProjectName: RuoYi
* @Package: com.ruoyi.common.utils.oss
* @ClassName: MinioUtil
* @Author: MC
* @Description: ${description}
* @Date: 2020/3/31 0031 9:12
* @Version: 1.0
*/
public class MinioUtil {
private static volatile MinioClient minioClient;
private MinioUtil(){}
@Log(title = "MinioUtil創建MinioClient對象", businessType = BusinessType.MINIO)
public static MinioClient getMinioClient() throws InvalidPortException, InvalidEndpointException {
if(minioClient == null){
synchronized(MinioUtil.class){
if(minioClient == null){
MinioComponent bean = SpringUtils.getBean(MinioComponent.class);
minioClient = new MinioClient(bean.getEndpoint(), bean.getAccessKey(), bean.getSecretKey());
}
}
}
return minioClient;
}
public static JSONObject uploaderFile(MultipartFile file, String projName,String bucketName) throws Exception {
if(file.isEmpty()){
return null;
}
String imgStr = "PNG,png,JPG,jpg,JPEG,jpeg,BMP,bmp,GIF,gif,SVG,svg";
String videoStr = "mp4,m4v,mov,qt,avi,flv,wmv,asf,mpeg,mpg,vob,mkv,asf,wmv,rm,rmvb,vob,ts,dat";
String OriginalFilename = file.getOriginalFilename();
String suffix = OriginalFilename.substring(OriginalFilename.lastIndexOf(".") + 1);
JSONObject jsonObject;
if(imgStr.indexOf(suffix) != -1){
jsonObject = uploadImage(file.getInputStream(),projName,bucketName,OriginalFilename);
jsonObject.put("fileType","0");
}else if(videoStr.indexOf(suffix) != -1){
jsonObject = uploadVideo(file.getInputStream(),projName,bucketName,OriginalFilename);
jsonObject.put("fileType","1");
}else{
jsonObject = uploadFile(file.getInputStream(),projName,bucketName,OriginalFilename);
jsonObject.put("fileType","3");
}
return jsonObject;
}
/**
*
* @Title: uploadImage
* @Description:上傳圖片
* @param inputStream
* @param projName
* @param bucketName
* @return
* @throws Exception
*/
public static JSONObject uploadImage(InputStream inputStream, String projName,String bucketName,String objName) throws Exception {
return upload(inputStream, projName,bucketName, objName,"image/jpeg");
}
/**
* @Title: uploadVideo
* @Description:上傳視頻
* @param inputStream
* @param projName
* @param bucketName
* @return
* @throws Exception
*/
public static JSONObject uploadVideo(InputStream inputStream, String projName,String bucketName,String objName) throws Exception {
return upload(inputStream, projName,bucketName,objName, "video/mp4");
}
/**
* @Title: uploadVideo
* @Description:上傳文件
* @param inputStream
* @param projName
* @param bucketName
* @return
* @throws Exception
*/
public static JSONObject uploadFile(InputStream inputStream, String projName,String bucketName,String objName) throws Exception {
return upload(inputStream, projName,bucketName,objName, "application/octet-stream");
}
/**
* 上傳字符串大文本內容
*
* @Title: uploadString
* @Description:描述方法
* @param str
* @return
* @throws Exception
*/
public static JSONObject uploadString(String projName,String bucketName,String str) throws Exception {
if (StringUtils.isEmpty(str)) {
return new JSONObject();
}
InputStream inputStream = new ByteArrayInputStream(str.getBytes());
return upload(inputStream, projName,bucketName,"", "text/html");
}
/**
* @Title: upload
* @Description:上傳主功能
* @return
* @throws Exception
*/
private static JSONObject upload(InputStream inputStream, String projName,String bucketName,String objName, String contentType) throws Exception {
if(minioClient == null){
minioClient = getMinioClient();
}
String suffix = "txt";//處理後綴名
if(!StringUtils.isEmpty(objName)){
suffix = objName.substring(objName.lastIndexOf(".") + 1);
}
JSONObject map = new JSONObject();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String ymd = sdf.format(new Date());
String objectName = ymd + "_" + (projName != null ? projName : "_")+ UUID.randomUUID().toString()+"."+suffix;
if(!StringUtils.isEmpty(contentType)){
minioClient.putObject(projName+bucketName, objectName, inputStream, contentType);
}else{
Map<String,String> headerMap = Maps.newHashMap();
minioClient.putObject(projName+bucketName, objectName, inputStream,headerMap);
}
map.put("flag", "0");
map.put("mess", "上傳成功");
map.put("objectName", objectName);
map.put("path", projName+bucketName + "/" + objectName);
return map;
}
/**
* 創建存儲桶
* @param projName
* @param bucketName
* @return
*/
public static boolean createBucket(String projName,String bucketName)throws Exception{
if(StringUtils.isEmpty(projName) || StringUtils.isEmpty(bucketName)){
return false;
}
if(minioClient == null){
minioClient = getMinioClient();
}
boolean b = minioClient.bucketExists(projName + bucketName);
if(!b){
minioClient.makeBucket(projName+bucketName);
}
return true;
}
/**
* 刪除存儲桶及其桶中的所有元素
* @param projName
* @param bucketName
* @return
* @throws Exception
*/
public static boolean removeBucket(String projName,String bucketName)throws Exception{
if(StringUtils.isEmpty(projName) || StringUtils.isEmpty(bucketName)){
return false;
}
if(minioClient == null){
minioClient = getMinioClient();
}
boolean b = minioClient.bucketExists(projName + bucketName);
if(!b){
Iterable<Result<Item>> results = minioClient.listObjects(projName + bucketName);
Iterator<Result<Item>> iterator = results.iterator();
while(iterator.hasNext()){
Result<Item> next = iterator.next();
Item item = next.get();
minioClient.removeObject(projName + bucketName,item.objectName());
}
minioClient.removeBucket(projName + bucketName);
}
return true;
}
/**
* 獲取對象流
* @param projName
* @param bucketName
* @param objectName
* @return
* @throws Exception
*/
public static InputStream getObject(String projName,String bucketName,String objectName) throws Exception{
if(StringUtils.isEmpty(projName) || StringUtils.isEmpty(bucketName) || StringUtils.isEmpty(objectName)){
return null;
}
if(minioClient == null){
minioClient = getMinioClient();
}
return minioClient.getObject(projName + bucketName,objectName);
}
/**
* 獲取對象簽名URL,默認有效時長爲7天
* @param projName
* @param bucketName
* @param objectName
* @return
* @throws Exception
*/
public static String getObjectSignUrl(String projName,String bucketName,String objectName) throws Exception{
if(StringUtils.isEmpty(projName) || StringUtils.isEmpty(bucketName) || StringUtils.isEmpty(objectName)){
return null;
}
if(minioClient == null){
minioClient = getMinioClient();
}
return minioClient.presignedGetObject(projName + bucketName,objectName);
}
/**
* 刪除存儲桶中的元素
* @param projName
* @param bucketName
* @param objectName
* @return
* @throws Exception
*/
public static boolean removeObject(String projName,String bucketName,String objectName)throws Exception{
if(StringUtils.isEmpty(projName) || StringUtils.isEmpty(bucketName) || StringUtils.isEmpty(objectName)){
return false;
}
if(minioClient == null){
minioClient = getMinioClient();
}
minioClient.removeObject(projName + bucketName,objectName);
return true;
}
}