docker 安装minio
检索 docker search minio
安装 docker pull minio/minio
启动命令
注意 密码需要修改
docker run -d -p 9000:9000 -p 9001:9001 --name=minio \
--restart=always \
--privileged=true \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=123456789" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio minio/minio server /data \
--console-address ":9001" \
--address ":9000"
-p 暴露端口 9000 90001
-e 设置用户名密码
-v 挂载文件
–console-address 配置控制台端口
–address 配置api接口
这时就可以访问minio了
http://192.168.1.6:9001/login
通过注解加载配置类
工具类
@Slf4j
@Component
public class MinioUtil {
@Autowired
private MinioClient minioClient;
@Autowired
private MinioProp prop;
/**
* 查看存储bucket是否存在
* @return boolean
*/
public Boolean bucketExists(String bucketName) {
Boolean found;
try {
found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
} catch (Exception e) {
log.error("查看存储bucket是否存在失败: 错误信息:{}",e);
return false;
}
return found;
}
/**
* 创建存储bucket
* @return Boolean
*/
public Boolean makeBucket(String bucketName) {
try {
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
log.error("创建存储bucket失败: 错误信息:{}",e);
return false;
}
return true;
}
/**
* 删除存储bucket
* @return Boolean
*/
public Boolean removeBucket(String bucketName) {
try {
minioClient.removeBucket(RemoveBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
log.error("删除存储bucket失败: 错误信息:{}",e);
return false;
}
return true;
}
/**
* 获取全部bucket
*/
public List<Bucket> getAllBuckets() {
try {
List<Bucket> buckets = minioClient.listBuckets();
return buckets;
} catch (Exception e) {
log.error("获取全部bucket失败: 错误信息:{}",e);
}
return null;
}
/**
* 文件上传
*
* @param file 文件
* @return Boolean
*/
public String upload(MultipartFile file) {
String originalFilename = file.getOriginalFilename();
if (StringUtils.isBlank(originalFilename)){
throw new RuntimeException();
}
int pointIndex = originalFilename.lastIndexOf(".");
String fileName = prop.getBucketName() + SnowflakeId.getInstance().nextId()+ (pointIndex > -1 ? originalFilename.substring(pointIndex) : "");;
try {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(prop.getBucketName()).object(fileName)
.stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
} catch (Exception e) {
log.error("上传失败: 错误信息:{}",e);
return null;
}
return fileName;
}
/**
* 文件上传
*
* @param file 文件
* @return Boolean
*/
public Map<String,String> upload(List<MultipartFile> file) {
Map<String,String> result = new HashMap<>();
for (int i=0;i<file.size();i++){
String originalFilename = file.get(i).getOriginalFilename();
result.put("originalFilename","");
if (StringUtils.isBlank(originalFilename)){
throw new RuntimeException();
}
int pointIndex = originalFilename.lastIndexOf(".");
String fileName = prop.getBucketName() + SnowflakeId.getInstance().nextId()+ (pointIndex > -1 ? originalFilename.substring(pointIndex) : "");;
try {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(prop.getBucketName()).object(fileName)
.stream(file.get(i).getInputStream(), file.get(i).getSize(), -1).contentType(file.get(i).getContentType()).build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
result.put(originalFilename,fileName);
} catch (Exception e) {
log.error("上传失败: 错误信息:{}",e);
result.put("originalFilename","error");
}
}
return result;
}
/**
* 预览图片
* @param fileName
* @return
*/
public String preview(String fileName){
// 查看文件地址
GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(prop.getBucketName()).object(fileName).method(Method.GET).build();
try {
String url = minioClient.getPresignedObjectUrl(build);
return url;
} catch (Exception e) {
log.error("预览失败: 错误信息:{}",e);
}
return null;
}
/**
* 文件下载
* @param fileName 文件名称
* @param res response
* @return Boolean
*/
public void download(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(prop.getBucketName())
.object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs)){
byte[] buf = new byte[1024];
int len;
try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){
while ((len=response.read(buf))!=-1){
os.write(buf,0,len);
}
os.flush();
byte[] bytes = os.toByteArray();
res.setCharacterEncoding("utf-8");
// 设置强制下载不打开
// res.setContentType("application/force-download");
res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
try (ServletOutputStream stream = res.getOutputStream()){
stream.write(bytes);
stream.flush();
}
}
} catch (Exception e) {
log.error("下载失败: 错误信息:{}",e);
}
}
/**
* 查看文件对象
* @return 存储bucket内文件对象信息
*/
public List<Item> listObjects() {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(prop.getBucketName()).build());
List<Item> items = new ArrayList<>();
try {
for (Result<Item> result : results) {
items.add(result.get());
}
} catch (Exception e) {
log.error("查看文件对象失败: 错误信息:{}",e);
return null;
}
return items;
}
/**
* 删除
* @param fileName
* @return
* @throws Exception
*/
public boolean remove(String fileName){
try {
minioClient.removeObject( RemoveObjectArgs.builder().bucket(prop.getBucketName()).object(fileName).build());
}catch (Exception e){
log.error("删除失败: 错误信息:{}",e);
return false;
}
return true;
}
yml配置
minio:
enable: true
address: http://192.168.1.6:9000
accessKey: admin
secretKey: wangjing
bucketName: goods
pom 引入的版本
**8.4.3无法创建minioClient对象**
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
以上部分可写到公共项目中
调用方式
@RestController
public class FileController{
@Autowired
private MinioProp prop;
@Autowired
private MinioUtil minioUtil;
@ApiOperation(value = "查看存储bucket是否存在")
@GetMapping("/bucketExists")
public boolean bucketExists(String bucketName) {
return minioUtil.bucketExists(bucketName);
}
}