CentOS部署Minio並基於該部署搭建一層可擴展的web管理系統項目

第一步、檢查環境

環境爲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;
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章