环境为centOS7
可连接网络,可使用ping www.baidu.com 进行检查
支持wget命令,如果不支持可以使用以下命令安装:
yum -y install wget
注意使用root帐号,yum命令也是需要联网的。
一切就绪。
官方地址有说明,可以查看官方网址
首先,使用root帐号登录
执行命令行如下:
wget https://dl.min.io/server/minio/release/linux-amd64/minio
这个时间比较耗时,因为连接的国外网站,请耐心等待。
下载完成后,分配权限,执行命令行如下:
chmod +x minio
这个时候可以通过ls命令看到minio文件颜色由原来的白色边成绿色了
接下来我们把minio文件移动到指定的文件夹中,执行命令如下:
mv minio /usr/bin
进入到usr/bin目录下查看是否存在该文件
接下来回到根目录,并创建一个用来存放minio系统文件的文件,执行命令如下:
mkdir /mnt/minio-data
接下来,请使用目录回到根目录
启动Minio,执行命令如下:
./minio server /mnt/minio-data
意思就是启动minio服务并且将生成的系统文件放到 /mnt/minio-data目录下。
这个时候控制台会输出一部分内容:
[root@node1 ~]# ./minio server /mnt/minio-data
Endpoint: http://1***我的IP:9000 http://10.0.2.15:9000 http://172.17.0.1:9000 http://127.0.0.1:9000
AccessKey: minioadmin
SecretKey: minioadmin
Browser Access:
http://1***我的IP:9000 http://10.0.2.15:9000 http://172.17.0.1:9000 http://127.0.0.1:9000
Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
注意AccessKey和SecretKey两个内容,是用来登录Mini的管理后台的。
这个时候启动成功了,接下来可以访问了,打开浏览器,访问linux所在IP的地址,端口号为9000
如果访问失败,有可能是防火墙没有开放,可以检查端口号9000状态是不是off,如果是,需要开放端口号,开放端口号的命令如下:
/sbin/iptables -I INPUT -p tcp --dport 9000 -j ACCEPT
再次用浏览器访问9000端口,成功访问,效果如下图:
输入刚才控制台输出的AccessKey和SecretKey内容即可登录,如图:
上图中的test是我创建好的一个存储桶,点击图中的“+”号可以创建存储桶,其实就是一个文件夹,用来存放上传的文件的。
这个时候基本上可以正常使用了。但是存在一个问题,如果控制台关闭了,那么服务也就关了,如何后台运行呢?
命令行执行,将Minio设置为后台执行,root帐号进入到根目录,执行命令如下:
nohup ./minio server /mnt/minio-data >/mnt/minio-data/minio_service.log &
将minio设置为后台运行并输出Log日志。
这个时候关闭控制台,再次使用浏览器访问9000端口测试即可,如果正常访问说明设置成功。
这个时候依然存在风险,服务器断电关机了怎么办?
需要开机重启,接下来编辑开机重启的脚本。
root帐号登录后,在home目录下创建一个sh文件:
vim /home/minioSysInit.sh
意思是创建一个minioSysInit.sh文件并直接进入编辑状态,
将下面的内容放进去:
# !/bin/bash
nohup ./minio server /mnt/minio-data >/mnt/minio-data/minio_service.log &
然后保存退出
接下来给该sh文件赋权限:
chmod +x /home/minioSysInit.sh
接下来编辑启动系统文件,执行命令:
vim /etc/rc.d/rc.local
将刚才的sh文件添加进去:
# 开机自启动Minio,此处修改为脚本位置
/home/minioSysInit.sh
OK,搞定。
添加项目依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>6.0.11</version>
</dependency>
注意是6.0.11,官方给的是3.+的,比较坑。
如果你是springboot项目可能会存在guava冲突,应该会多出来一个2.0的jar包,去除一个即可。
个人基于minio搭建了一层管理项目,可直接下载下来使用,开放了公共上传接口,可通过postman测试:http://localhost/oss/ossMinioFile/upload
项目下载地址:点击这里
添加依赖后就可以直接使用了,参考代码:
package com.ruoyi.common.utils.oss;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import io.minio.MinioClient;
import io.minio.Result;
import io.minio.errors.*;
import io.minio.messages.Item;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
/**
* @ProjectName: RuoYi
* @Package: com.ruoyi.common.utils.oss
* @ClassName: MinioUtil
* @Author: MC
* @Description: ${description}
* @Date: 2020/3/31 0031 9:12
* @Version: 1.0
*/
public class MinioUtil {
private static volatile MinioClient minioClient;
private MinioUtil(){}
@Log(title = "MinioUtil创建MinioClient对象", businessType = BusinessType.MINIO)
public static MinioClient getMinioClient() throws InvalidPortException, InvalidEndpointException {
if(minioClient == null){
synchronized(MinioUtil.class){
if(minioClient == null){
MinioComponent bean = SpringUtils.getBean(MinioComponent.class);
minioClient = new MinioClient(bean.getEndpoint(), bean.getAccessKey(), bean.getSecretKey());
}
}
}
return minioClient;
}
public static JSONObject uploaderFile(MultipartFile file, String projName,String bucketName) throws Exception {
if(file.isEmpty()){
return null;
}
String imgStr = "PNG,png,JPG,jpg,JPEG,jpeg,BMP,bmp,GIF,gif,SVG,svg";
String videoStr = "mp4,m4v,mov,qt,avi,flv,wmv,asf,mpeg,mpg,vob,mkv,asf,wmv,rm,rmvb,vob,ts,dat";
String OriginalFilename = file.getOriginalFilename();
String suffix = OriginalFilename.substring(OriginalFilename.lastIndexOf(".") + 1);
JSONObject jsonObject;
if(imgStr.indexOf(suffix) != -1){
jsonObject = uploadImage(file.getInputStream(),projName,bucketName,OriginalFilename);
jsonObject.put("fileType","0");
}else if(videoStr.indexOf(suffix) != -1){
jsonObject = uploadVideo(file.getInputStream(),projName,bucketName,OriginalFilename);
jsonObject.put("fileType","1");
}else{
jsonObject = uploadFile(file.getInputStream(),projName,bucketName,OriginalFilename);
jsonObject.put("fileType","3");
}
return jsonObject;
}
/**
*
* @Title: uploadImage
* @Description:上传图片
* @param inputStream
* @param projName
* @param bucketName
* @return
* @throws Exception
*/
public static JSONObject uploadImage(InputStream inputStream, String projName,String bucketName,String objName) throws Exception {
return upload(inputStream, projName,bucketName, objName,"image/jpeg");
}
/**
* @Title: uploadVideo
* @Description:上传视频
* @param inputStream
* @param projName
* @param bucketName
* @return
* @throws Exception
*/
public static JSONObject uploadVideo(InputStream inputStream, String projName,String bucketName,String objName) throws Exception {
return upload(inputStream, projName,bucketName,objName, "video/mp4");
}
/**
* @Title: uploadVideo
* @Description:上传文件
* @param inputStream
* @param projName
* @param bucketName
* @return
* @throws Exception
*/
public static JSONObject uploadFile(InputStream inputStream, String projName,String bucketName,String objName) throws Exception {
return upload(inputStream, projName,bucketName,objName, "application/octet-stream");
}
/**
* 上传字符串大文本内容
*
* @Title: uploadString
* @Description:描述方法
* @param str
* @return
* @throws Exception
*/
public static JSONObject uploadString(String projName,String bucketName,String str) throws Exception {
if (StringUtils.isEmpty(str)) {
return new JSONObject();
}
InputStream inputStream = new ByteArrayInputStream(str.getBytes());
return upload(inputStream, projName,bucketName,"", "text/html");
}
/**
* @Title: upload
* @Description:上传主功能
* @return
* @throws Exception
*/
private static JSONObject upload(InputStream inputStream, String projName,String bucketName,String objName, String contentType) throws Exception {
if(minioClient == null){
minioClient = getMinioClient();
}
String suffix = "txt";//处理后缀名
if(!StringUtils.isEmpty(objName)){
suffix = objName.substring(objName.lastIndexOf(".") + 1);
}
JSONObject map = new JSONObject();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String ymd = sdf.format(new Date());
String objectName = ymd + "_" + (projName != null ? projName : "_")+ UUID.randomUUID().toString()+"."+suffix;
if(!StringUtils.isEmpty(contentType)){
minioClient.putObject(projName+bucketName, objectName, inputStream, contentType);
}else{
Map<String,String> headerMap = Maps.newHashMap();
minioClient.putObject(projName+bucketName, objectName, inputStream,headerMap);
}
map.put("flag", "0");
map.put("mess", "上传成功");
map.put("objectName", objectName);
map.put("path", projName+bucketName + "/" + objectName);
return map;
}
/**
* 创建存储桶
* @param projName
* @param bucketName
* @return
*/
public static boolean createBucket(String projName,String bucketName)throws Exception{
if(StringUtils.isEmpty(projName) || StringUtils.isEmpty(bucketName)){
return false;
}
if(minioClient == null){
minioClient = getMinioClient();
}
boolean b = minioClient.bucketExists(projName + bucketName);
if(!b){
minioClient.makeBucket(projName+bucketName);
}
return true;
}
/**
* 删除存储桶及其桶中的所有元素
* @param projName
* @param bucketName
* @return
* @throws Exception
*/
public static boolean removeBucket(String projName,String bucketName)throws Exception{
if(StringUtils.isEmpty(projName) || StringUtils.isEmpty(bucketName)){
return false;
}
if(minioClient == null){
minioClient = getMinioClient();
}
boolean b = minioClient.bucketExists(projName + bucketName);
if(!b){
Iterable<Result<Item>> results = minioClient.listObjects(projName + bucketName);
Iterator<Result<Item>> iterator = results.iterator();
while(iterator.hasNext()){
Result<Item> next = iterator.next();
Item item = next.get();
minioClient.removeObject(projName + bucketName,item.objectName());
}
minioClient.removeBucket(projName + bucketName);
}
return true;
}
/**
* 获取对象流
* @param projName
* @param bucketName
* @param objectName
* @return
* @throws Exception
*/
public static InputStream getObject(String projName,String bucketName,String objectName) throws Exception{
if(StringUtils.isEmpty(projName) || StringUtils.isEmpty(bucketName) || StringUtils.isEmpty(objectName)){
return null;
}
if(minioClient == null){
minioClient = getMinioClient();
}
return minioClient.getObject(projName + bucketName,objectName);
}
/**
* 获取对象签名URL,默认有效时长为7天
* @param projName
* @param bucketName
* @param objectName
* @return
* @throws Exception
*/
public static String getObjectSignUrl(String projName,String bucketName,String objectName) throws Exception{
if(StringUtils.isEmpty(projName) || StringUtils.isEmpty(bucketName) || StringUtils.isEmpty(objectName)){
return null;
}
if(minioClient == null){
minioClient = getMinioClient();
}
return minioClient.presignedGetObject(projName + bucketName,objectName);
}
/**
* 删除存储桶中的元素
* @param projName
* @param bucketName
* @param objectName
* @return
* @throws Exception
*/
public static boolean removeObject(String projName,String bucketName,String objectName)throws Exception{
if(StringUtils.isEmpty(projName) || StringUtils.isEmpty(bucketName) || StringUtils.isEmpty(objectName)){
return false;
}
if(minioClient == null){
minioClient = getMinioClient();
}
minioClient.removeObject(projName + bucketName,objectName);
return true;
}
}