MinIo简单使用以及web应用

目录

一.下载和启动

1.下载

2.启动 

 3.创建用户

4.创建桶

 二. 基本的使用

1.依赖

2.创建上传类和测试

 三. web上传的使用

1.导入相关依赖

2.在yml中配置minlo

3.代码


 

对于项目的文件存储可以使用像阿里云、腾讯云这种平台的服务,当然也可以自己搭建一个文件管理系统。这里简单介绍一下MinIo
官网地址: MinIO | 高性能,对Kubernetes友好的对象存储 MinIO;是一款开源的对象存储服务器,兼容亚马逊的S3协议 , 对Kubernetes能够友好的支持,专为AI等云原生工作负载而设计,MinIO中国。icon-default.png?t=M666http://www.minio.org.cn/

一.下载和启动

1.下载

在官网中下载对应的系统版本,本文是以window系统为主

MinIo简单使用以及web应用_第1张图片

2.启动 

在导航栏输入cmd,弹出窗口后输入  minio server ./data

MinIo简单使用以及web应用_第2张图片

 如上图就是已经开启成功了,打开网页输入http://127.0.0.1:9000,输入上面页面的账号密码RootUser: minioadmin
RootPass: minioadmin

MinIo简单使用以及web应用_第3张图片

 3.创建用户

MinIo简单使用以及web应用_第4张图片

 MinIo简单使用以及web应用_第5张图片

 点击自己创建的用户,并点击service account按钮然后点击create service account按钮,创建服务账号可以用来登录

MinIo简单使用以及web应用_第6张图片

4.创建桶

用来保存数据

 MinIo简单使用以及web应用_第7张图片

 MinIo简单使用以及web应用_第8张图片

 二. 基本的使用

1.依赖

创建一个maven项目,在pom.xml中导入依赖

//版本需要根据自己需要的来导入

    io.minio
    minio
    8.3.3
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

2.创建上传类和测试

FileUploader.java

import java.security.InvalidKeyException;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.UploadObjectArgs;
import org.springframework.stereotype.Service;
import io.minio.MinioClient;
import io.minio.errors.MinioException;


public class FileUploader {

    public static void uploadFile() throws InvalidKeyException, IOException, NoSuchAlgorithmException {
        try {
            // Create a minioClient with the MinIO server playground, its access key and secret key.
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint("http://localhost:9000") //你的endpoint,本机可以不变
                            .credentials("你的accessKey", "你的sercetKey")
                            .build();

            // Make 'asiatrip' bucket if not exist.
            boolean found =                   minioClient.bucketExists(BucketExistsArgs.builder().bucket("你的桶名称").build());
            if (!found) {
                // Make a new bucket called 'asiatrip'.
                minioClient.makeBucket(MakeBucketArgs.builder().bucket("你的桶名称").build());
            } else {
                System.out.println("Bucket '你的桶名称' already exists.");
            }

            // Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket
            // 'asiatrip'.
            minioClient.uploadObject(
                    UploadObjectArgs.builder()
                            .bucket("你的桶名称")
                            .object("自定义.png")
                            .filename("你需要上传的文件路径")
                            .build());
            System.out.println(
                    "'你需要上传的文件路径' is successfully uploaded as "
                            + "object '自定义.png' to bucket '你的桶名称'.");
        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
            System.out.println("HTTP trace: " + e.httpTrace());
        }
    }
    }
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 在测试类中测试上面的方法

 @Test
    void contextLoads() {
        try {
            fileUploader.uploadFile();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

在你的桶中查看上传是否成功

MinIo简单使用以及web应用_第9张图片

 三. web上传的使用

1.导入相关依赖

   
            
                io.minio
                minio
                ${miniio.version}
            

2.在yml中配置minlo

# Miniio配置
minio:
  endpoint: 127.0.0.1
  port: 9000
  accessKey: minioadmin
  secretKey: minioadmin
  secure: false
  bucketName: "huike-crm"
  configDir: "/data/excel"

3.代码

CommonController
package com.huike.web.controller.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.huike.clues.service.ISysFileService;
import com.huike.common.core.controller.BaseController;
import com.huike.common.core.domain.AjaxResult;

/**
 * 通用请求处理
 */
@RestController
public class CommonController extends BaseController {
    private static final Logger log = LoggerFactory.getLogger(CommonController.class);

    @Autowired
    private ISysFileService fileService;


    /**
     * 通用上传请求
     */
    @PostMapping("/common/upload")
    public AjaxResult uploadFile(MultipartFile file){
        try{
            // 上传文件路径
            return fileService.upload(file);
        }catch (Exception e){
            return AjaxResult.error(e.getMessage());
        }
    }
}
ISysFileService
package com.huike.clues.service;


import org.springframework.web.multipart.MultipartFile;
import com.huike.common.core.domain.AjaxResult;

public interface ISysFileService {

	/**
	 * 文件上传
	 * @param file
	 * @return
	 */
	AjaxResult upload(MultipartFile file);

}
SysFileServiceImpl
package com.huike.clues.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import io.minio.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.huike.clues.service.ISysFileService;
import com.huike.common.config.MinioConfig;
import com.huike.common.core.domain.AjaxResult;
import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class SysFileServiceImpl implements ISysFileService{

	@Autowired
	MinioConfig minioConfig;

	/**
	 * 文件上传至Minio
	 * 使用try catch finally进行上传
	 * finally里进行资源的回收
	 */
	@Override
	public AjaxResult upload(MultipartFile file) {
		InputStream inputStream = null;
		//创建Minio的连接对象
		MinioClient minioClient = getClient();
		String bucketName = minioConfig.getBucketName();
		try {
			inputStream = file.getInputStream();
			//基于官网的内容,判断文件存储的桶是否存在 如果桶不存在就创建桶
			//TODO 补全这部分代码
			// Make 'asiatrip' bucket if not exist.
			boolean found =
					minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
			if (!found) {
				// Make a new bucket called 'asiatrip'.
				minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
			} else {
				System.out.println("Bucket " +bucketName+ " already exists.");
			}

			/**
			 * ================================操作文件================================
			 * 思路:我们上传的文件是:合同.pdf
			 * 那么我们应该上传到配置的bucket内 我们配置的bucketName是huike-crm
			 * 那么我们存在桶里的文件应该是什么样的 也叫“合同.pdf”吗?
			 * 应该按照上传的年月日进行区分
			 * 举例:2021-05-05日进行上传的
			 * 那么存在桶里的路径应该是
			 * huike-crm/2021/05/05/这个目录下
			 * 而对于同一个文件,存在重名问题,所以我们应该利用UUID生成一个新的文件名,并拼接上 .pdf 作为文件后缀
			 * 那么完整的路径就是 huike-crm/2021/05/05/uuid.pdf
			 * 如果上述思路你无法理解,那么就直接存放在桶内生成uuid+.pdf即可
			 * 即:huike-crm/uuid.pdf
			 */
			//TODO 基于上述逻辑补全代码
			String filename = file.getOriginalFilename();
			String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) + UUID.randomUUID().toString().replaceAll("-", "")
					+ filename.substring(filename.lastIndexOf("."));
			//文件上传
			//由于使用的是SpringBoot与之进行集成 上传的时候拿到的是MultipartFile 需要通过输入输出流的方式进行添加
			PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
					.bucket(bucketName)
					.contentType(file.getContentType())
					.stream(file.getInputStream(),file.getSize(),-1).build();
			minioClient.putObject(objectArgs);

			/**
			 * 构建返回结果集
			 */
			AjaxResult ajax = AjaxResult.success();
			/**
			 * 封装需要的数据进行返回
			 */
			ajax.put("fileName", "/"+bucketName+"/"+objectName);
			//url需要进行截取
			ajax.put("url", minioConfig.getEndpoint()+":"+ minioConfig.getPort()+"/"+ minioConfig.getBucketName()+"/"+filename);
			return ajax;
		}catch(Exception e){
			e.printStackTrace();
			return AjaxResult.error("上传失败");
		}finally {
			//防止内存泄漏
			if (inputStream != null) {
				try {
					inputStream.close(); // 关闭流
				} catch (IOException e) {
					log.debug("inputStream close IOException:" + e.getMessage());
				}
			}
		}
	}


	/**
	 * 免费提供一个获取Minio连接的方法
	 * 获取Minio连接
	 * @return
	 */
	private MinioClient getClient(){
		MinioClient minioClient =
				MinioClient.builder()
						.endpoint("http://"+minioConfig.getEndpoint()+":"+ minioConfig.getPort())
						.credentials(minioConfig.getAccessKey(),minioConfig.getSecretKey())
						.build();
		return minioClient;
	}
}
MinioConfig
package com.huike.common.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @className: MinioConfig
 * @author Hope
 * @date 2020/7/28 13:43
 * @description: MinioConfig
 */

@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {

    private final static String HTTP = "http://";

    //endPoint是一个URL,域名,IPv4或者IPv6地址
    private String endpoint;

    //TCP/IP端口号
    private int port;

    //accessKey类似于用户ID,用于唯一标识你的账户
    private String accessKey;

    //secretKey是你账户的密码
    private String secretKey;

    //如果是true,则用的是https而不是http,默认值是true
    private Boolean secure;

    //默认存储桶
    private String bucketName;
}

你可能感兴趣的:(java,spring,boot,maven)