1.minio部署
推荐使用DockerCompose部署
可参考下面的地址:
Minio官网(中文):http://www.minio.org.cn/
DockerHub地址:https://hub.docker.com/r/minio/minio
DockerCompose部署minio:Docker使用docker compose单机部署对象存储系统minio (2022新版本)
2.添加maven依赖
依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
注意:这个依赖很容易和HTTP请求的依赖产生依赖冲突的问题
可以通过添加dependencyManagement
来解决这类问题,还有依赖的顺序也要注意
这里以okhttps
来举例
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
<dependency>
<groupId>com.ejlchina</groupId>
<artifactId>okhttps</artifactId>
<version>3.5.2</version>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.4</version>
</dependency>
</dependencies>
</dependencyManagement>
3.编写配置文件
因为minio的配置是需要我们自己来读取的,所以名称无所谓,但还是应该尽量规范一些
此处,我们以yml格式为例
minio:
endpoint: http://192.168.200.128:9000
accessKey: admin
secretKey: admin123
bucketName: application
downloadURL: http://192.168.0.119:9000/minio/download/
4.编写minio的配置类
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Configuration
@Component
public class MinIOClientConfig {
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.secretKey}")
private String secretKey;
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
这一步完成后,可以启动项目测试一下,如果没有报错,就说明minio连接成功了
5.通过minio存储静态资源
先编写一个返回类,已经有的话,根据情况改返回的结构就行
用到的依赖有lombok
和swagger
,可以根据需求调整
状态码:
public interface ResultCode {
Integer SUCCESS = 200;
Integer ERROR = 500;
}
返回类:
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class R {
@ApiModelProperty(value = "是否成功")
private Boolean success;
@ApiModelProperty(value = "返回码")
private Integer code;
@ApiModelProperty(value = "返回消息")
private String message;
@ApiModelProperty(value = "返回数据")
private Map<String, Object> data = new HashMap<String, Object>();
private R(){}
public static R ok(){
R r = new R();
r.setSuccess(true);
r.setCode(ResultCode.SUCCESS);
r.setMessage("成功");
return r;
}
public static R error(){
R r = new R();
r.setSuccess(false);
r.setCode(ResultCode.ERROR);
r.setMessage("失败");
return r;
}
public R success(Boolean success){
this.setSuccess(success);
return this;
}
public R message(String message){
this.setMessage(message);
return this;
}
public R code(Integer code){
this.setCode(code);
return this;
}
public R data(String key, Object value){
this.data.put(key, value);
return this;
}
public R data(Map<String, Object> map){
this.setData(map);
return this;
}
}
编写minio的Controller类
import io.minio.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
import java.util.UUID;
@CrossOrigin
@RestController
@RequestMapping("minio")
public class MinIOController {
@Resource
private MinioClient minioClient;
@Value("${minio.bucketName}")
private String bucketName;
@Value("${minio.downloadURL}")
private String downloadURL;
public String getFileName(String name){
String[] split = name.split("\\.");
return UUID.randomUUID() + "." + split[split.length-1];
}
@PostMapping("/upload")
public R upload(MultipartFile file){
try {
String fileName = getFileName(Objects.requireNonNull(file.getOriginalFilename()));
PutObjectArgs objectArgs = PutObjectArgs.builder().object(fileName)
.bucket(bucketName)
.contentType(file.getContentType())
.stream(file.getInputStream(),file.getSize(),-1).build();
minioClient.putObject(objectArgs);
return R.ok().message(downloadURL + fileName);
} catch (Exception e) {
System.err.println(e.getMessage());
return R.error().message(e.getMessage());
}
}
@GetMapping("/download/{filename}")
public void download(@PathVariable String filename, HttpServletResponse res){
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName)
.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.addHeader("Content-Disposition", "attachment;fileName=" + filename);
try ( ServletOutputStream stream = res.getOutputStream()){
stream.write(bytes);
stream.flush();
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
@DeleteMapping("/deleteFile/{fileName}")
public R deleteFile(@PathVariable("fileName") String fileName) {
try {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
} catch (Exception e){
System.err.println(e.getMessage());
return R.error();
}
return R.ok();
}
}
打开swagger测试一下,也可以用其他工具
接口会返回下载浏览的路径
成功
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)