访问官网:https://docs.min.io/
再当前的文件目录中输入cmd
通过命令行启动Minio
minio server ./data
启动完成后,可以看到访问的路径http://127.0.0.1:9000
使用提供的账号密码进行登录
账号:minioadmin
密码:minioadmin
http://172.16.17.121:9000/huike-crm/java.png
http://172.16.17.121:9000/huike-crm/java.png
现在通过一个案列与java集成
代码实现:
1.先在pom.xml导入依赖,(官网获取)
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.7</version>
</dependency>
2. 配置yml;
# Miniio配置
minio:
endpoint: 127.0.0.1
port: 9000
accessKey: minioadmin
secretKey: minioadmin
secure: false
bucketName: "huike-crm" //桶名
configDir: "/data/excel"
config:
@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;
}
controller层:
/**
* 通用请求处理
*/
@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());
}
}
}
service接口:
public interface ISysFileService {
/**
* 文件上传
* @param file
* @return
*/
AjaxResult upload(MultipartFile file);
}
service实现类:
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
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();
minioConfig.setBucketName("asiatrip");
//这里想另外创建一个桶,没有将文件上传到yml配置的"huike-crm"桶里 ,也可以忽略这一步
String bucketName = minioConfig.getBucketName();
try {
inputStream = file.getInputStream();
//TODO 补全这部分代码
/**
* ================================操作文件================================
* 思路:我们上传的文件是:合同.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 基于上述逻辑补全代码
//基于官网的内容,判断文件存储的桶是否存在 如果桶不存在就创建桶
boolean found =
minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!found) {
// Make a new bucket called 'asiatrip'.
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
//操作文件
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-");
String date = sdf.format(new Date());
String filename = file.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 6);
// String fileUploadPath = date + uuid + filename.substring(filename.lastIndexOf("."));
String fileUploadPath = date + uuid + filename.toString();
//文件上传
//由于使用的是springboot与之进行集成,上传的时候拿到的是MultipartFile 需要通过输入输出流的方式进行添加
PutObjectArgs objuctargs=PutObjectArgs.builder().bucket(bucketName).object(fileUploadPath)
.contentType(file.getContentType())
.stream(file.getInputStream(),file.getSize(),-1).build();
minioClient.putObject(objuctargs);
// String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) + UUID.randomUUID().toString().replaceAll("-", "")
// + fileName.substring(fileName.lastIndexOf("."));
// Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket
// 'asiatrip'.
// minioClient.uploadObject(
// UploadObjectArgs.builder()
// .bucket("asiatrip")
// .object("合同.pdf")
// .filename("E:\\xiangmu\\项目二\\CRM 实战\\day05-勇于突破\\学员任务资料\\任务22-技术应用\\合同模板\\合同.pdf")
// .build());
// System.out.println(
// "'/home/user/Photos/asiaphotos.zip' is successfully uploaded as "
// + "object 'asiaphotos-2015.zip' to bucket 'asiatrip'.");
/**
* 构建返回结果集
*/
AjaxResult ajax = AjaxResult.success();
/**
* 封装需要的数据进行返回
*/
ajax.put("fileName", "/"+bucketName+"/"+fileUploadPath);
//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;
}
}
测试:
运行代码