Linux和windows下minio+springboot实现文件服务器上传下载和nginx反向代理

1 minio服务器的安装

在下载minio.exe文件:

windows安装minio服务器:MinIO | Code and downloads to create high performance object storage官网下载.exe文件

或者自己到csdn上找一个

我的是放到了D盘里自己的文件夹下

 start.bat脚本内容

.\minio.exe server D:\wlc\middlewire\minio

 D:\wlc\middlewire\minio ==> 这是我的minio.exe放的文件夹路径

双击start.bat就可以启动,初始密码在.minio.sys文件夹里

 

 叉掉start.bat启动窗口,就是关掉minio了,在双击启动minio,密码生效,到此就部署完毕,linux和这个一样

访问:浏览器地址栏里输入:ip:9000 或者localhost:9000 即可

 鼠标点击页面右下放的  + 号,就会出现创建bucket和上传文件选型

 点击 上传bucket就会弹出创建bucket窗口,输入名字就可以创建成功,我的是test和wlcfile两个,你的随你的意思吧;

此时文件上传成功,访问图片需要登录,所以我们要把不需要登录就可以访问的图片都放在一个bucket里,我的是wlcfile这个bucket;

然后对wlcfile进行免登录就可以访问配置

 

 到此就可以不用登录就可以访问了,你可以在html里搞个image的html标签来试试

<!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文件下,方面统一管理

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访问进行下反向代理,访问 wlcfile下的文件都不需要登录授权,因为刚刚设置了访问策略了  *.*   还记得吗?嘿嘿


#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文件夹下执行上面的命令,minio是我自己建的文件夹,你可以自己放到自己喜欢的位置

cd /opt/minio
#再执行下面的命令,下载minio文件
wget https://dl.minio.io/server/minio/release/linux-amd64/minio

 给minio,你刚刚下载的minio的文件服赋权: 

chmod 777 -R minio

再minio文件下,创建log文件夹,再log文件夹中创建minio.log文件,方便日志管理

 在/opt/minio文件夹下创建启动和停止脚本,和minio文件同级目录最好,方便管理

 启动脚本,start.sh

nohup /opt/minio/minio server --address '你本机内网ip:9000' --console-address '你本机内网ip:9001' /opt/minio > /opt/minio/log/minio.log 2>&1 &

命令解释:

nohup /opt/minio/minio server --address '你本机内网ip:9000' --console-address '你本机内网ip:9001' /opt/minio > /opt/minio/log/minio.log 2>&1 &


--address '你本机内网ip:9000'            minio的api地址端口配置,ip是你的内网地址,端口是9000
                                        上传下载都用9000,也就是--address '你本机内网ip:9000'
                                        你访问可以用你的  外网地址:9000来api访问,也可以用
                                        ng来反向代理

--console-address '你本机内网ip:9001'    minio控制台地址,端口是9001,你自己随意改,
                                        就是浏览器 访问地址

 /opt/minio                             安装目录,运行的文件保存夹地址,minio的配置文件
                                        和你上传的文件都在这里面

> /opt/minio/log/minio.log 2>&1 &       日志输出地址 

执行启动脚本:

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

日志:

下面是我的ng反向代理配置,我的是不是在云上服务器的,要把云上服务器端口打开,并且安全组配置放行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或者域名;   #对应9001端口
        location / {
          proxy_pass http://minio;
        }
    }
    #minio的图片访问配置
    server {
        listen       80;
        server_name  图片访问的ip或者域名;  #对应9000端口
        location / {
          proxy_pass http://download;
        }
    }

至此你可以用你的springboot项目上传,下载,或者浏览器访问,

注意:上传下载访问的ip或者域名是对应 9000的api端口,浏览器访问的是控制台9001端口的

minio的文件名相同会自动覆盖原先文件

linux下的minio的界面和上面的不太一样,bucket公开访问设置如下

 

 

 

更多精彩分享请移步:IT学习道场

更多分享关注公众号【IT学习道场】

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT学习道场

为你的进步加点油!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值