目录
一.下载和启动
1.下载
2.启动
3.创建用户
4.创建桶
二. 基本的使用
1.依赖
2.创建上传类和测试
三. web上传的使用
1.导入相关依赖
2.在yml中配置minlo
3.代码
对于项目的文件存储可以使用像阿里云、腾讯云
这种平台的服务,当然也可以自己搭建一个文件管理系统。这里简单介绍一下MinIo
官网地址: MinIO | 高性能,对Kubernetes友好的对象存储 MinIO;是一款开源的对象存储服务器,兼容亚马逊的S3协议 , 对Kubernetes能够友好的支持,专为AI等云原生工作负载而设计,MinIO中国。http://www.minio.org.cn/
在官网中下载对应的系统版本,本文是以window系统为主
在导航栏输入cmd,弹出窗口后输入 minio server ./data
如上图就是已经开启成功了,打开网页输入http://127.0.0.1:9000,输入上面页面的账号密码RootUser: minioadmin
RootPass: minioadmin
点击自己创建的用户,并点击service account
按钮然后点击create service account
按钮,创建服务账号可以用来登录
用来保存数据
创建一个maven项目,在pom.xml中导入依赖
//版本需要根据自己需要的来导入
io.minio
minio
8.3.3
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());
}
}
}
在测试类中测试上面的方法
@Test
void contextLoads() {
try {
fileUploader.uploadFile();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
在你的桶中查看上传是否成功
io.minio
minio
${miniio.version}
# Miniio配置
minio:
endpoint: 127.0.0.1
port: 9000
accessKey: minioadmin
secretKey: minioadmin
secure: false
bucketName: "huike-crm"
configDir: "/data/excel"
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;
}