Minio 是一个基于Apache License v2.0开源协议的对象存储服务,官方提供了很多语言的SDK。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
安装配置和SDK之类的就看官方文档就非常好,很全面:https://docs.minio.io/cn/
在实际操作的时候,发现minio分享文件,最多支持分享七天。
调用客户端的presignedGetObject方法,expires最多设置为七天即:
DEFAULT_EXPIRY_TIME = 7 * 24 * 3600;
下面是方法的源码,
/**
* Returns an presigned URL to download the object in the bucket with given expiry time.
*
* </p><b>Example:</b><br>
* <pre>{@code String url = minioClient.presignedGetObject("my-bucketname", "my-objectname", 60 * 60 * 24);
* System.out.println(url); }</pre>
*
* @param bucketName Bucket name.
* @param objectName Object name in the bucket.
* @param expires Expiration time in seconds of presigned URL.
*
* @return string contains URL to download the object.
*
* @throws InvalidBucketNameException upon an invalid bucket name
* @throws InvalidKeyException upon an invalid access key or secret key
* @throws IOException upon signature calculation failure
* @throws NoSuchAlgorithmException upon requested algorithm was not found during signature calculation
* @throws InvalidExpiresRangeException upon input expires is out of range
*/
public String presignedGetObject(String bucketName, String objectName, Integer expires)
throws InvalidBucketNameException, NoSuchAlgorithmException, InsufficientDataException, IOException,
InvalidKeyException, NoResponseException, XmlPullParserException, ErrorResponseException,
InternalException, InvalidExpiresRangeException {
return presignedGetObject(bucketName, objectName, expires, null);
}
这显然不符合我的需求,我使用minio作为图片服务器,希望前端能够永久下载链接,通过查看SDK和网上查找实践,可以通过设置访问策略解决。下面是三种设置策略的方式:
一:服务端设置访问策略:
编辑想要共享的bucket,添加访问策略Prefix为 * ,policy为Read And Write
二、通过客户端远程设置访问策略
首先是安装minio客户端,这个官方文档很清楚。
使用 minio client 将我自己的 minio server 添加到 mc 的配置管理:
mc config host add minio http://xxx.xxx.xxx.xxx:9000 minio password S3v4
这样我们才能直接管理这个 minio server 端,然后配置下载策略
mc policy public minio/base
这个命令的作用是将 server 端的 base 桶设置为开放管理,可以直接通过 url 进行下载。
[桶名]/[路径]可以一直拼接到具体的文件夹或文件。
三、通过Java代码设置访问策略
1.设置访问策略的方法:
private MinioClient client;
/**
* 设置访问策略
* @param objectPrefix
* @param policyType
*/
public void setBucketPolicy(String objectPrefix,PolicyType policyType) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InsufficientDataException, InternalException, NoResponseException, InvalidBucketNameException, XmlPullParserException, ErrorResponseException, InvalidObjectPrefixException, RegionConflictException {
if (null == this.bucket() || 0 == this.bucket().length()) {
throw new IllegalStateException("Empty bucket specified!");
}
if (this.client.bucketExists(this.bucket())) {
if (!policyType.equals(client.getBucketPolicy(this.bucket(),objectPrefix))) {
client.setBucketPolicy(this.bucket(),objectPrefix,policyType);
}
} else {
this.client.makeBucket(this.bucket());
client.setBucketPolicy(this.bucket(),objectPrefix,policyType);
}
}
2.在生成客户端bean时调用:
oss.setBucketPolicy("*", PolicyType.READ_WRITE);