Linux和windows下minio+springboot實現(xiàn)文件服務(wù)器上傳下載和nginx反向代理

 minio服務(wù)器的安裝

在下載minio.exe文件:

windows安裝minio服務(wù)器:MinIO | Code and downloads to create high performance object storage官網(wǎng)下載.exe文件

或者自己到csdn上找一個,我的是放到了D盤里自己的文件夾下



start.bat腳本內(nèi)容

.\minio.exe server D:\wlc\middlewire\minio
D:\wlc\middlewire\minio ==> 這是我的minio.exe放的文件夾路徑

雙擊start.bat就可以啟動,初始密碼在.minio.sys文件夾里





叉掉start.bat啟動窗口,就是關(guān)掉minio了,在雙擊啟動minio,密碼生效,到此就部署完畢,linux和這個一樣

訪問:瀏覽器地址欄里輸入:ip:9000 或者localhost:9000 即可



 鼠標(biāo)點擊頁面右下放的  + 號,就會出現(xiàn)創(chuàng)建bucket和上傳文件選型



 點擊 上傳bucket就會彈出創(chuàng)建bucket窗口,輸入名字就可以創(chuàng)建成功,我的是test和wlcfile兩個,你的隨你的意思吧;

此時文件上傳成功,訪問圖片需要登錄,所以我們要把不需要登錄就可以訪問的圖片都放在一個bucket里,我的是wlcfile這個bucket;

然后對wlcfile進(jìn)行免登錄就可以訪問配置





到此就可以不用登錄就可以訪問了,你可以在html里搞個image的html標(biāo)簽來試試

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
 
    <title><aaa</title>
  </head>
  <body>
    
    <div id="app">
     
  <img src="http://localhost:9000/wlcfile/98f771f9302dcb1754e1abf34a79c91.png" alt="圖片">
  </body>
</html>


瀏覽器里就可以訪問的了,也可以在瀏覽器地址欄:http://localhost:9000/wlcfile/98f771f9302dcb1754e1abf34a79c91.png   也可以

2 整合springboot + minio
maven引入依賴

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>4.0.0</version>
</dependency>
在springboot的application.yml中新增minio的配置



minio:
  endpoint: http://localhost:9000
  accesskey: xxxxxxx
  secretKey: xxxxxxx
我的都放在我的util下的file文件下,方面統(tǒng)一管理








package com.wlc.doc.util.file;
 
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
/**
 * minio配置類
 */
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProp {
    /**
     * 連接url
     */
    private String endpoint;
    /**
     * 用戶名
     */
    private String accesskey;
    /**
     * 密碼
     */
    private String secretKey;
}
package com.wlc.doc.util.file;
 
import io.minio.MinioClient;
import io.minio.errors.InvalidEndpointException;
import io.minio.errors.InvalidPortException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
 * minio的配置 并注入bean  MinioClient
 */
@Configuration
@EnableConfigurationProperties(MinioProp.class)
public class MinioConfiguration {
    @Autowired
    private MinioProp minioProp;
 
    @Bean
    public MinioClient minioClient() throws InvalidPortException, InvalidEndpointException {
        MinioClient  client =new MinioClient(minioProp.getEndpoint(),minioProp.getAccesskey(),minioProp.getSecretKey());
        return  client;
    }
}
package com.wlc.doc.util.file;
 
/**
 * minio的bucket配置類
 */
public class CommonConstants {
    //bucket的名字
    public static final String MINIO_BUCKET="wlcfile";
}
package com.wlc.doc.util.file;
 
import com.google.api.client.util.IOUtils;
import com.wlc.doc.exception.BusinessException;
import io.minio.MinioClient;
import io.minio.ObjectStat;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
 
 
/**
 * 描述: minio的util </br>
 * 時間: 2022-02-26 15:10  </br>
 * 作者:王林沖
 */
@Component
public class MinioUtil {
    @Autowired
    private MinioClient minioClient;
 
    /**
     * 上傳文件,
     * @param fileName 文件名
     * @param inputStream 文件輸入流
     * @param size 文件大小
     * @param contentType 類型
     * @return String - 路徑 = bucket名字 + "/" + 文件名
     */
    public String uploadByInputStream(String fileName, InputStream inputStream, long size, String contentType){
 
        try {
            minioClient.putObject(CommonConstants.MINIO_BUCKET, fileName, inputStream, size, contentType);
            return StringUtils.join(CommonConstants.MINIO_BUCKET, "/", fileName) ;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }finally {
            if (inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
 
    /**
     * 上傳文件
     * @param file MultipartFile
     * @return
     */
    public String uploadByFile(MultipartFile file) {
 
        if(file==null || file.getSize()==0){
            throw new BusinessException("上傳文件不能為空");
        }
        String orgfileName = file.getOriginalFilename();
        orgfileName = orgfileName;
        InputStream in = null;
        try {
            in = file.getInputStream();
            String contentType= file.getContentType();
            minioClient.putObject(CommonConstants.MINIO_BUCKET, orgfileName, in, file.getSize(), contentType);
            return StringUtils.join(CommonConstants.MINIO_BUCKET, "/", orgfileName);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        finally {
            if (in != null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
 
    }
 
    /**
     * 下載
     * @param response
     * @param fileName 文件名
     */
    public void download( HttpServletResponse response, String fileName) {
        InputStream in = null;
        try {
            //獲取文件對象 stat原信息
            ObjectStat stat = minioClient.statObject(CommonConstants.MINIO_BUCKET, fileName);
            response.setContentType(stat.contentType());
            in = minioClient.getObject(CommonConstants.MINIO_BUCKET, fileName);
            IOUtils.copy(in, response.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
 
 
}


controller測試






@RestController
@RequestMapping("/file")
public class FileController {
 
    @Autowired
    MinioUtil minioUtil;
 
    //上傳
    @PostMapping("/minioUpload")
    public String minioUpload(@RequestParam(name = "file",required = false) MultipartFile file, HttpServletRequest request){
        String path = minioUtil.uploadByFile(file);
        return path;
    }
 
    //下載
    @GetMapping("/minioDownload")
    public void minioDownload(String fileName, HttpServletResponse response){
        minioUtil.download(response,fileName);
    }
 
 
}
用postman測試下,我的ok的



3 配置nginx代理minio的文件訪問

安裝nginx這里就不說,很簡單,自己找個博客部署一個就行,linux和windows一樣的

下面的ng的配置文件而已,啟動ng后或者重新reload配置都行,自己看下就行

。就是對minio訪問進(jìn)行下反向代理,訪問 wlcfile下的文件都不需要登錄授權(quán),因為剛剛設(shè)置了訪問策略了  *.*   還記得嗎?嘿嘿

#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
  upstream minio {
    server localhost:9000;
  }
  #minio的圖片訪問配置
    server {
        listen       9009;
        server_name  localhost;
        location / {
          proxy_pass http://minio;
          proxy_set_header Host $http_host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-NginX-Proxy true;
        }
    }
 
}
至此就可以用ng的代理訪問了。ng所在的ip  + 代理的端口號 + bucket的名字 + 文件名  就好了

示例:http://localhost:9009/wlcfile/98f771f9302dcb1754e1abf34a79c91.png

http://localhost:9009 -->ng的代理ip和端口

wlcfile:bucket名字

98f771f9302dcb1754e1abf34a79c91.png:這是文件名

linux的minio的部署
下載軟件包

wget https://dl.minio.io/server/minio/release/linux-amd64/minio
我的是在/opt/minio文件夾下執(zhí)行上面的命令,minio是我自己建的文件夾,你可以自己放到自己喜歡的位置

cd /opt/minio
#再執(zhí)行下面的命令,下載minio文件
wget https://dl.minio.io/server/minio/release/linux-amd64/minio



給minio,你剛剛下載的minio的文件服賦權(quán):

chmod 777 -R minio
再minio文件下,創(chuàng)建log文件夾,再log文件夾中創(chuàng)建minio.log文件,方便日志管理



在/opt/minio文件夾下創(chuàng)建啟動和停止腳本,和minio文件同級目錄最好,方便管理



啟動腳本,start.sh

nohup /opt/minio/minio server --address '你本機內(nèi)網(wǎng)ip:9000' --console-address '你本機內(nèi)網(wǎng)ip:9001' /opt/minio > /opt/minio/log/minio.log 2>&1 &
命令解釋:

nohup /opt/minio/minio server --address '你本機內(nèi)網(wǎng)ip:9000' --console-address '你本機內(nèi)網(wǎng)ip:9001' /opt/minio > /opt/minio/log/minio.log 2>&1 &
 
 
--address '你本機內(nèi)網(wǎng)ip:9000'            minio的api地址端口配置,ip是你的內(nèi)網(wǎng)地址,端口是9000
                                        上傳下載都用9000,也就是--address '你本機內(nèi)網(wǎng)ip:9000'
                                        你訪問可以用你的  外網(wǎng)地址:9000來api訪問,也可以用
                                        ng來反向代理
 
--console-address '你本機內(nèi)網(wǎng)ip:9001'    minio控制臺地址,端口是9001,你自己隨意改,
                                        就是瀏覽器 訪問地址
 
 /opt/minio                             安裝目錄,運行的文件保存夾地址,minio的配置文件
                                        和你上傳的文件都在這里面
 
> /opt/minio/log/minio.log 2>&1 &       日志輸出地址

執(zhí)行啟動腳本:

[root@wlc-node-1 minio]# ./start.sh
日志:



下面是我的ng反向代理配置,我的是不是在云上服務(wù)器的,要把云上服務(wù)器端口打開,并且安全組配置放行9000這個api端口,密碼和上面windows里的地址和改法一樣,在安裝目錄 下的.minio.sys/config里的 config.json文件里,修改 access_key和 secret_key的value,分別是賬號和密碼

    #minio的控制臺地址
    upstream minio {
      server 172.22.221.225:9001;
    }
  #minio的文件上傳下載訪問地址
  upstream download {
    server 172.22.221.225:9000;
  }
    #minio的控制臺配置
   server {
        listen       80;
        server_name  控制臺訪問ip或者域名;   #對應(yīng)9001端口
        location / {
          proxy_pass http://minio;
        }
    }
    #minio的圖片訪問配置
    server {
        listen       80;
        server_name  圖片訪問的ip或者域名;  #對應(yīng)9000端口
        location / {
          proxy_pass http://download;
        }
    }
至此你可以用你的springboot項目上傳,下載,或者瀏覽器訪問,

注意:上傳下載訪問的ip或者域名是對應(yīng) 9000的api端口,瀏覽器訪問的是控制臺9001端口的

minio的文件名相同會自動覆蓋原先文件

linux下的minio的界面和上面的不太一樣,bucket公開訪問設(shè)置如下









minio是一個很好的對象存儲文件服務(wù)器,希望大家自己動手實戰(zhàn)







作者:老王

歡迎關(guān)注微信公眾號 : IT學(xué)習(xí)道場