springboot项目的文件上传至本地的minio框架

本文档详细介绍了如何在本地安装和配置MinIO对象存储服务,并提供了在Linux环境下两种不同的安装方法。此外,还讲解了如何使用Java SDK进行文件上传和下载,包括相关依赖的引入和配置。最后,给出了SpringBoot应用中MinIO配置类的示例代码。
摘要由CSDN通过智能技术生成

文件上传,可以上传至本地,也可以上传至第三方服务器(阿里云,七牛云等)上,这篇文件是讲上传至本地的做法。

一、minIO简介

官网:https://min.io/
操作文档:https://docs.min.io/docs/java-client-quickstart-guide.html
中文版:http://www.minio.org.cn/ (注意:中文版本的有些资料更新没那么及时,建议看官网地址)
github项目地址:https://github.com/minio/
下载地址:https://min.io/download
511689

MinIO 是一款基于Go语言的高性能对象存储服务。它采用了Apache License v2.0开源协议,兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

二、安装minIO

MInIO的安装有很多方法、单实例的、集群分布式的、docker部署的、支持k8s的,我们使用最简单的一种安装方式:linux单节点安装。

如果希望对MinIO有深入的掌握,访问MinIO官网:https://min.io

2.1 微软Windows系统

下载二进制文件 : 微软Windows系统 64位 https://dl.min.io/server/minio/release/windows-amd64/minio.exe

然后输入命令:
minio.exe server D:\Photos

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

输入http://127.0.0.1:9000输入账号密码
在这里插入图片描述

2.2 GNU/Linux 安装

方式一:

下载二进制文件 :GNU/Linux 64-bit Intel https://dl.min.io/server/minio/release/linux-amd64/minio

Copychmod +x minio./minio server /data

方式二:推荐
首先在/root目录下创建一个minio文件夹

cd /root
mkdir minio
cd minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
 

在这里插入图片描述
等待下载完成后:

在当前minio目录下,会出现一个minio目录

chmod +x minio
 
# 创建minio文件存储目录及日志目录
mkdir -p /root/data/minio;
mkdir -p /root/logs/minio;

然后在 /root/minio/目录下,新建一个run.sh并编辑以下内容

vim run.sh,然后将以下内容保存到run.sh,并为其赋予执行权限chmod u+x run.sh

#!/bin/bash
export MINIO_ROOT_USER=fsp-manage
export MINIO_ROOT_PASSWORD=springboot-fsp-manage
# nohup启动服务 指定文件存放路径 /root/data 还有设置日志文件路径 /root/minio/log
nohup ./minio server --address :9002 --console-address :9001 /root/data/minio > /root/logs/minio/minio.log 2>&1 &

注意:以前的老版本minio的配置中,配置用户名和密码时,是这两个参数:

MINIO_ACCESS_KEY 和MINIO_SECRET_KEY

而现在比较新的版本的minio,需要替换成MINIO_ROOT_USER和MINIO_ROOT_PASSWORD

并且用户名和密码都是由长度限制的,用户名长度不能小于3,密码不能小于8个字符

–address :9002 --console-address :9001 是配置端口,默认minio端口是9000,如果9000端口被占用了,那就加上这一串配置,端口号的冒号之前不需要特意写出ip,当然如果你的ip的动态变化的,而不是静态的话,前边的ip不用写上,当然最好是用静态的ip

然后启动minio

# 启动minio服务
bash run.sh
# 查看日志
tail -200f /root/logs/minio/minio.log

在这里插入图片描述

然后会有日志打印信息,然后可以看到minio服务器地址,和控制台信息地址

然后在浏览器中访问地址

http://192.168.0.131:9002,输入这个地址后会重定向到控制台登录地址http://192.168.0.131:9001/login

然后在登录界面输入用户名和密码即可登录

然后登录后进入首页,创建一个bucket

在这里插入图片描述

在这里插入图片描述

然后打开可预览的设置

在这里插入图片描述

接下来我以开发环境中的桶演示minio文件的上传和下载等

2.3 Docker 容器

Copydocker pull minio/minio
docker run -p 9000:9000 minio/minio server /data

安装后使用浏览器访问http://127.0.0.1:9000,如果可以访问,则表示minio已经安装成功。

三、使用

3.1 导入依赖

查找 minio 最新依赖,通过 maven 查询网站查询, 这搜索框输入 minio, 也可以查看 MinIO 官网 https://docs.min.io/docs/java-client-quickstart-guide.html如下

在这里插入图片描述

<!-- minio 文件上传本地框架-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.3.4</version>
        </dependency>
<!-- 防止okhttp和minio的冲突-->
<dependency>
            <groupId>me.tongfei</groupId>
            <artifactId>progressbar</artifactId>
            <version>0.5.3</version>
        </dependency>

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.8.1</version>
        </dependency>

 <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>

3.2 pom


server:
  port: 9002


spring:
  servlet:
    multipart:
      enabled: true # 开启文件上传
      max-file-size: 10MB #限制文件上传大小
	  max-request-size: 100MB



# 自定义minio 参数配置	  
minio:
  endpoint: http://localhost:9000 # MinIO服务所在地址和端口号
  accessKey: minioadmin # 访问的key
  secretKey:minioadmin # 访问的秘钥

3.3 minio配置类

方式一:

@Configuration
public class MinIoClientConfig {
 
    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
 
    /**
     * 注入minio 客户端
     * @return
     */
    @Bean
    public MinioClient minioClient(){
 
    return MinioClient.builder()
                        .endpoint(endpoint)
                        .credentials(accessKey, secretKey)
                        .build();
    }
}

方式二:

package com.xiaomifeng1010.minio.configuration;
 
import io.minio.MinioClient;
import io.minio.errors.InvalidPortException;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
 
/**
 * @author xiaomifeng1010
 * @version 1.0
 * @date: 2022/5/20 10:30
 * @Description minio配置
 */
@Configuration
@Component
@ConfigurationProperties(prefix = "minio")
@Getter
@Setter
public class MinioConfig {
    private String endpoint;
    private String accessKey;
    private String secretKey;

 
    @Bean
    public MinioClient getMinioClient() throws InvalidPortException {
        MinioClient minioClient = MinioClient.builder().endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
        return minioClient;
    }
//
//    @Bean(name = "multipartResolver")
//    public MultipartResolver multipartResolver(){
//        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
//        resolver.setDefaultEncoding("UTF-8");
//        //resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
//        resolver.setResolveLazily(true);
//        resolver.setMaxInMemorySize(40960);
//        //上传文件大小 50M 50*1024*1024
//        resolver.setMaxUploadSize(50*1024*1024);
//        return resolver;
//    }
}
 

3.4 使用

package com.example.demo001.controller;

import io.minio.GetObjectArgs;
import io.minio.GetObjectResponse;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

/**
 * @author lc
 * @version 1.0
 * @date 2022/8/4 13:30
 */
@RestController
public class UploadController {

    @Resource
    private MinioClient minioClient;

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public String upload(MultipartFile file){
        try {
            PutObjectArgs objectArgs = PutObjectArgs.builder().object(file.getOriginalFilename())
                    .bucket("test") // 桶名字
                    .contentType(file.getContentType())
                    .stream(file.getInputStream(),file.getSize(),-1).build();

            minioClient.putObject(objectArgs);
            return "ok";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }


    /**
     * 下载文件
     * @param filename
     */
    @GetMapping("/download/{filename}")
    public void download(@PathVariable String filename, HttpServletResponse res){

        GetObjectArgs objectArgs = GetObjectArgs.builder().bucket("test")
                .object(filename).build();

        try (GetObjectResponse response = minioClient.getObject(objectArgs)){
            byte[] buf = new byte[1024];

            int len;

            try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){

                while ((len=response.read(buf))!=-1){

                    os.write(buf,0,len);

                }
                os.flush();

                byte[] bytes = os.toByteArray();

                res.setCharacterEncoding("utf-8");
                res.setContentType("application/force-download");// 设置强制下载不打开
                res.addHeader("Content-Disposition", "attachment;fileName=" + filename);
                try ( ServletOutputStream stream = res.getOutputStream()){
                    stream.write(bytes);
                    stream.flush();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}




上传接口调用
在这里插入图片描述

如何通过浏览器访问刚上传的图片呢,就是通过 endpoint 服务地址加 bucket 名称加图片的名称,在本例子访问路径则为:29d6d5c639b72e82cdad274396b9bc02.jpeg

下载接口调用

在这里插入图片描述

启动SpringBoot应用,使用Postman来访问上传接口进行文件上传

上传完成后,我们打开MinIO的管理界面可以看到上传后的图片,也可以通过返回的url来访问图片:

四、扩展

4.1 重复文件的校验

4.2 分布式文件存储

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LC超人在良家

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值