目录
2.在application.yml中加入如下配置并创建相关类
前沿
做Java开发的小伙伴肯定遇到过这样的情景,我们在做某个需求的时候需要将图片上传到服务器。很多时候我们就是自己在服务器下面建立一个文件夹然后自己写程序(输入输出流)来实现文件的上传。当然了这种方式挺不错的,但是还有更好的方法吗?当然了,今天就来讲一下如何使用minio来实现这个需求。
minio介绍
MinIO 是高性能的对象存储,是为海量数据存储、人工智能、大数据分析而设计的,它完全兼容Amazon S3接口,单个对象最大可达5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。MinIO主要采用Golang语言实现,,客户端与存储服务器之间采用http/https通信协议。
使用步骤
1.下载minio文件
我是用的Linux服务器,你可以去这个连接下载所需要的minio文件
2.创建文件夹并上传minio文件
我在自己的/home下创建了一个minio文件又在minio下创建了data文件
mkdir -p /home/minio/data
然后将minio文件传到该文件下
3.操作如下指令
4.访问
默认情况再minio的访问端口是9000,你可以通过http://ip地址:9000来访问,输入你上面设置的access和secret登录即可
其实这个时候如果我们的minio服务在关机重启或者我们使用ctrl+C后是会关闭,那么如何设置自启动呢?就是说如何实现我们的Linux服务器启动的时候自启动我们的minio,请看最后一节哦。我们现将minio的使用步骤讲完。
5.创建存储桶
点击箭头所示的地方创建自己的存储桶即可,我之前已经创建过一个picbucket了
6.设置
点击箭头所示地方
修改这个地方为public
7.测试图片上传
点击如图所示地方并点击upload测试即可
至此我们就已经搭建好了我们服务商的minio,那么如何使用程序来实现图片的上传呢?
8.Java程序的使用步骤
1. 在pom中加入如下依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>3.0.10</version>
</dependency>
2.在application.yml中加入如下配置并创建相关类
# minio 文件存储配置信息
minio:
endpoint: http://192.168.150.138:9800
accesskey: minioadmin
secretKey: minioadmin
bucket : picbucket
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProp {
/**
* 连接url
*/
private String endpoint;
/**
* 用户名
*/
private String accesskey;
/**
* 密码
*/
private String secretKey;
/**
* 桶名称
*/
private String bucket;
}
@Configuration
@EnableConfigurationProperties(MinioProp.class)
public class MinioConfig {
@Autowired
private MinioProp minioProp;
/**
* 获取 MinioClient
*
* @return
* @throws InvalidPortException
* @throws InvalidEndpointException
*/
@Bean
public MinioClient minioClient() throws InvalidPortException, InvalidEndpointException {
return new MinioClient(minioProp.getEndpoint(), minioProp.getAccesskey(), minioProp.getSecretKey());
}
}
@Component
public class MinioUtils {
@Autowired
private MinioClient client;
/**
* 创建bucket
*
* @param bucketName bucket名称
*/
@SneakyThrows
public void createBucket(String bucketName) {
if (!client.bucketExists(bucketName)) {
client.makeBucket(bucketName);
}
}
/**
* 上传文件
*
* @param file 文件
* @return
*/
public String uploadFile(MultipartFile file,MinioProp minioProp) throws Exception {
// 判断上传文件是否为空
if (null == file || 0 == file.getSize()) {
throw new BizException(4000,"上传文件不能为空");
}
try {
// 判断存储桶是否存在
createBucket(minioProp.getBucket());
// 文件名
String originalFilename = file.getOriginalFilename();
// 新的文件名 = 存储桶名称_时间戳+【10000-99999】随机数字.后缀名
Random random = new Random();
String fileName = minioProp.getBucket() + "_" + System.currentTimeMillis() +(random.nextInt(99999 - 10000) + 10000 + 1)+ originalFilename.substring(originalFilename.lastIndexOf("."));
// 开始上传
client.putObject(minioProp.getBucket(), fileName, file.getInputStream(), file.getContentType());
return minioProp.getEndpoint() + "/" + minioProp.getBucket() + "/" + fileName;
} catch (Exception e) {
throw new BizException(4000,e.getMessage());
}
}
}
接下来编写自己的上传接口即可
@ApiOperation("上传图片接口,目前是穿到我自己的虚拟机Linux上,返回图片地址")
@PostMapping("upload-image.json")
public PicInfoVO upload(String base64) {
try {
MultipartFile file = new Base64ToMultipartFileUtil(base64,"data:image/jpeg;base64");
PicInfoVO vo = new PicInfoVO();
String imageUrl = minioUtils.uploadFile(file, minioProp);
vo.setImageUrl(imageUrl);
return vo;
} catch (Exception e) {
throw new BizException(4000, e.getMessage());
}
}
在网上找了一个base64字符串并测试如下,返回了图片的地址
访问图片地址
且服务器上也有了相应的图片
好了,讲完了,谢谢你的观看哦。
minio服务自启动
前面我们讲过可,当我们的Linux服务器关机重启或者我们使用ctrl+C退货minio服务的时候我们的minio服务是不会自己启动的。
如何设置自启动,首先我们补充一点就是在我们的/home/minio/data下建立一个minio.log文件
touch /home/minio/minio.log 用来记录我们的minio日志,当然了你放在哪里都行,我自己是放在这里的
打开开机自启文件
vi /etc/rc.local
添加自启脚本
添加完后一定要记得保存哦
修改权限
chmod +x /etc/rc.local
重启测试
reboot
然后访问http://ip地址:9800看是否可以