直接在linux上进行环境搭建,使用命令进行下载minio并且启动服务
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data
服务启动之后,可以直接对9000端口进行访问,同样的启动服务之后有日志进行输出。可以看到日志所表达的意思,在这里的一个控制台的端口是一个动态生成的,每一次启动服务的端口都会发生变换,在后续进行使用的使用肯定需要用到一个静态端口,可以使用--console-address ":38345"
来进行端口指定,并且第二个的话是指不推荐使用默认账号密码。
WARNING: Console endpoint is listening on a dynamic port (38345), please use --console-address ":PORT" to choose a static port.
WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables
对账号密码进行设置,并且指定控制台端口进行启动。
export MINIO_ROOT_USER=admin
# export MINIO_ROOT_PASSWORD=123456
export MINIO_ROOT_PASSWORD=123456
./minio server --console-address ":38345" /tools/minio/data
在设置完账号密码之后进行启动,发现了报错,访问密钥长度至少3个字符,密钥长度至少8个字符……,密钥太短了,把密码设置长点即可。
ERROR Unable to validate credentials inherited from the shell environment: Invalid credentials
> Please provide correct credentials
HINT:
Access key length should be at least 3, and secret key length at least 8 characters
直接通过docker命令进行构建一个容器进行服务启动,
docker run -p 9000:9000 -p 50000:50000 --name minio
-e "MINIO_ROOT_USER=admin"
-e "MINIO_ROOT_PASSWORD=12345678"
-v /tools/minio/data:/data
minio/minio server --console-address ":50000" /data
通过这种方式进行部署,可以发现在对一个节点进行文件上传之后,其他的节点也会生成相对应的文件。而当单个的文件存储的目录损坏,并不会影响到文件的使用,其他的目录还可以进行提供服务。
docker run -p 9000:9000 -p 50000:50000 --name minio \
-v /tools/minio/data1:/data1 \
-v /tools/minio/data2:/data2 \
-v /tools/minio/data3:/data3 \
-v /tools/minio/data4:/data4 \
-v /tools/minio/data5:/data5 \
-v /tools/minio/data6:/data6 \
-v /tools/minio/data7:/data7 \
-v /tools/minio/data8:/data8 \
minio/minio server --console-address ":50000" /data{1...8}
直接使用官方的方式进行下载安装
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
MC的使用,进行连接到minio服务器,这里已经启动好了一个服务器,MC的配置文件可以通过第一行命令进行查看,第二行命令直接把当前服务器的信息给加入到配置当中。
./mc config host ls
./mc config host add minio http://192.168.101.128:9000 admin 12345678
# 删除配置
./mc config host remove minio
这里对于mc的相关的一些指令在官网当中也有了相关的描述。
alias set, remove and list aliases in configuration file
ls list buckets and objects
mb make a bucket
rb remove a bucket
cp copy objects
mirror synchronize object(s) to a remote site
cat display object contents
head display first 'n' lines of an object
pipe stream STDIN to an object
share generate URL for temporary access to an object
find search for objects
sql run sql queries on objects
stat show object metadata
mv move objects
tree list buckets and objects in a tree format
du summarize disk usage recursively
retention set retention for object(s)
legalhold set legal hold for object(s)
diff list differences in object name, size, and date between two buckets
rm remove objects
encrypt manage bucket encryption config
event manage object notifications
watch listen for object notification events
undo undo PUT/DELETE operations
policy manage anonymous access to buckets and objects
tag manage tags for bucket(s) and object(s)
ilm manage bucket lifecycle
version manage bucket versioning
replicate configure server side bucket replication
admin manage MinIO servers
update update mc to latest release
简单对几个命令进行使用,其余的命令都基本上差不多
# 查看minio的所有桶信息
./mc ls minio
# 上传文件到桶当中
./mc cp /tools/minio/index.html minio1/bucket1
# 将桶中的文件下载当虚拟机当中
./mc cp minio1/bucket1/index.html /tools/minio
# 创建桶
./mc mb minio1/bucket2
# 删除桶
./mc rb minio1/bucket2
# 强制删除桶
./mc rb --force minio1/bucket2
MC admin 的使用:官网描述
service restart and stop all MinIO servers
update update all MinIO servers
info display MinIO server information
user manage users
group manage groups
policy manage policies defined in the MinIO server
config manage MinIO server configuration
heal heal disks, buckets and objects on MinIO server
profile generate profile data for debugging purposes
top provide top like statistics for MinIO
trace show http trace for MinIO server
console show console logs for MinIO server
prometheus manages prometheus config
kms perform KMS management operations
bucket manage buckets defined in the MinIO server
使用命令进行使用
# 查看所有用户
./mc admin user list minio1
# 添加用户
./mc admin user add minio1 yueyue
# 删除用户
./mc admin user remove minio1 yueyue
# 查看所有策略
./mc admin policy list minio1
# 查看策略信息
./mc admin policy info minio readwrite
# 自定义策略
./mc admin policy add minio1 lzq /root/lzq.json
# 自定义文件 lzq.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListAllMyBuckets",
"s3:ListBucket",
"s3:PutObject",
"s3:DeleteObject",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::lzq/*"
]
}
]
}
# 给用户指定策略
./mc admin policy set minio1 lzq user=yueyue
首先直接导入minio的操作jar包。
<dependency>
<groupId>io.miniogroupId>
<artifactId>minioartifactId>
<version>8.3.4version>
dependency>
之后就可以直接使用代码来对minio提供的SDK进行操作了,比较常用的还是上传文件和下载文件,先创建一个MC对象,之后对MC对象进行操作上传和下载文件即可。
public static void main(String[] args) throws Exception {
MinioClient minioClient =
MinioClient.builder()
.endpoint("http://192.168.101.128:9000")
.credentials("admin", "12345678")
.build();
boolean found =
minioClient.bucketExists(BucketExistsArgs.builder().bucket("bucket1").build());
if (!found) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket("bucket1").build());
System.out.println("bucket1 桶不存在 已创建该桶");
}
try{
minioClient.uploadObject(
UploadObjectArgs.builder()
.bucket("lzq")
.object("pom1.xml")
.filename("pom.xml")
.build());
System.out.println("上传成功");
} catch (Exception e) {
System.out.println("获取MC对象失败");
}
}
在下载文件有提供两种方式,一种是直接下载到指定目录下的,另一种是可以直接生成一个url地址,提供给前端进行下载的,这里提供的url也可以设置一个有效时间。
public static void main(String[] args) throws Exception{
try {
MinioClient minioClient =
MinioClient.builder()
.endpoint("http://192.168.101.128:9000")
.credentials("admin", "12345678")
.build();
minioClient.downloadObject(
DownloadObjectArgs.builder()
.bucket("lzq")
.object("pom1.xml")
.filename("./pom1.xml")
.build());
System.out.println("下载成功");
Map<String, String> reqParams = new HashMap<String, String>();
reqParams.put("response-content-type", "application/json");
String url =
minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket("lzq")
.object("pom.xml")
.expiry(60, TimeUnit.SECONDS)
.extraQueryParams(reqParams)
.build());
System.out.println(url);
}catch (Exception e){
System.out.println("获取MC对象失败");
}
}
而对于其余的SDK操作可以直接到minio的官网进行查看进行相对应的操作。https://docs.min.io/docs/java-client-api-reference.html
在minio的SDK当中提供了对多种语言的支持,常用的还是java,很多时候对于简单的项目来说完全就不需要走后端了,直接在前端完成上传和下载文件岂不是更快,对于现在的vue+elementui来开发前端,直接用elementui提供的组件进行操作。
首先构建一个vue脚手架项目,把elementui和minio的依赖进行安装。
npm install --save minio
npm i element-ui -S
最简单的方式就是直接连接到客户端,将文件直接上传到指定的桶当中
var Minio = require('minio')
var minioClient = new Minio.Client({
endPoint: '192.168.101.128',
port: 9000,
useSSL: false,
accessKey: 'admin',
secretKey: '12345678'
});
var file = './test.html'
minioClient.fPutObject('lzq', 'test.html', file, function(err, etag) {
if (err) return console.log(err)
console.log('文件上传成功')
});
这里的话每一次上传的文件的文件名都是相同的话那不就会裂开,所以在这里可以使用一个vue-uuid,用来生成uuid,将uuid作为文件名来保持每个文件的内容都不相同,并且光看文件名完全猜不到文件的内容。首先直接导入依赖。
npm i -S vue-uuid
之后就是在代码当中导入,主要有三种方式:
1、 在全局当中导入
import UUID from "vue-uuid";
Vue.use(UUID);
this.$uuid.v1()
2、 局部导入
import { uuid } from 'vue-uuid';
uuid.v1()
3、 在node当中使用
const uuid = require('uuid')
uuid.v4()
之后就可以直接进行导入使用了,这里就先直接写在js当中,用node来进行启动。
var Minio = require('minio')
const uuid = require('uuid')
var minioClient = new Minio.Client({
endPoint: '192.168.101.128',
port: 9000,
useSSL: false,
accessKey: 'admin',
secretKey: '12345678'
});
var file = './test.html'
minioClient.fPutObject('lzq', uuid.v4(), file, function(err, etag) {
if (err) return console.log(err)
console.log('文件上传成功')
});
这样每一次上传到minio服务器的文件名都是uuid的值,每个文件的名称都保持了唯一。这里前面是根据文件的所在目录来进行上传文件,还可以通过文件的内容进行转码来进行文件上传。
var Fs = require('fs')
var file = './test.html'
var fileStream = Fs.createReadStream(file)
var fileStat = Fs.stat(file, function(err, stats) {
if (err) {
return console.log(err)
}
minioClient.putObject('lzq', uuid.v4(), fileStream, stats.size, function(err, objInfo) {
if(err) {
return console.log(err) // err should be null
}
console.log("Success", objInfo)
})
})
最后就是文件下载了,在前面可以将文件给进行上传到指定的桶当中,之后就可以直接通过桶去拿桶里面指定的文件了。
var size = 0
function Uint8ArrayToString(fileData) {
var dataString = ''
for (var i = 0; i < fileData.length; i++) {
dataString += String.fromCharCode(fileData[i])
}
return dataString
}
let base64Str = ''
minioClient.getObject('lzq', '1.png', function(err, dataStream) {
if (err) {
return console.log(err)
}
dataStream.on('data', function(chunk) {
base64Str += Uint8ArrayToString(chunk)
})
dataStream.on('end', function() {
console.log(base64Str)
})
dataStream.on('error', function(err) {
console.log(err)
})
})
这里的话是图片文件,图片文件转成base64的文件内容就可以直接通过html或者css进行显示到页面上了。