第一步先引入minio依赖
<!--测试minio-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.12.0</version>
</dependency>
这里强制修改okhttp3的版本是因为,有时会存在jar包冲突的问题,导致文件上传报错
java.lang.NoSuchMethodError: okhttp3.Headers.iterator()Ljava/util/Iterator;
我最开始在单体项目中测试上传的时候只引入了下面这个依赖,上传,删除,下载都没问题
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
然后把代码迁入微服务后,上传就报上面那个错误,然后检查半天,可能时jar包冲突,如果报错可以尝试降低版本,minio和boot的版本也存在一些关系,大家可以百度一下。
接下来在yml中配置变量
#minio本地测试
minio:
minioUrl: http://ip:端口
userName: minio后台账号
passWrod: 密码
bucketName: minio中桶
配置config
@Data
@Component
public class MinIoClientConfig {
@Value("${minio.minioUrl}")
private String minioUrl;
@Value("${minio.userName}")
private String userName;
@Value("${minio.passWrod}")
private String passWrod;
/**
* 客户端
*/
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint(minioUrl)
.credentials(userName, passWrod)
.build();
}
}
Controller层
返回体改成自己的就行
@RestController
@RequestMapping("/minio")
public class MinioController {
@Autowired
private MinioClient minioClient;
@Value("${minio.bucketName}")
private String bucketName;
@Value("${minio.minioUrl}")
private String url;
//上传文件,返回生成的访问地址
@PostMapping("/uploadlist")
public ApiResult<String> uploadlist(MultipartFile file){
String orgfileName = file.getOriginalFilename();
//文件名加上uuid防止重复文件名
String exts = orgfileName.substring(orgfileName.lastIndexOf(".") + 1);
String substring = orgfileName.substring(0,orgfileName.indexOf("."));
orgfileName =substring+UUID.randomUUID().toString() + "." + exts;
try {
//文件上传
InputStream in = file.getInputStream();
minioClient.putObject(
PutObjectArgs.builder().bucket(bucketName).object(orgfileName).stream(
in, file.getSize(), -1)
.contentType(file.getContentType())
.build());
in.close();
} catch (Exception e) {
return new ApiResult<>("上传失败");
}
String fileUrl = url+"/"+bucketName+"/"+orgfileName;
return new ApiResult<>(fileUrl);
}
我这里文件上传后返回的地址,可以在浏览器里直接访问到,是需要在minio后台配置公共的访问方式,就可以了如果考虑安全问题,或者是想把文件分享给第三方,可以生成有一个临时的url,即使时私有的也能访问,不过链接有时间限制,会过期。
@GetMapping("/url")
public String getObjectUrl(String fileName) throws Exception {
// 创建参数
GetPresignedObjectUrlArgs presignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder()
.bucket(bucketName)
.object(fileName) // 文件名字
.method(Method.GET) // http请求方式
.expiry(5, TimeUnit.MINUTES) // url过期时间
.build();
return minioClient.getPresignedObjectUrl(presignedObjectUrlArgs);
}
}
/**
* 删除文件
*
*/
@PostMapping("/delete/{fileName}")
public ApiResult<String> delete(@PathVariable("fileName") String filename){
try {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName)
.object(filename).build());
}catch (Exception e){
e.getMessage();
return new ApiResult<String>("删除失败");
}
return new ApiResult<String>("删除成功");
}
//获取上传文件列表
@GetMapping("/list")
public ApiResult<List<String>> list() {
List<String> result = new ArrayList<>();
// 获取bucket中的文件对象列表
ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().bucket(bucketName).build();
Iterable<Result<Item>> objects = minioClient.listObjects(listObjectsArgs);
objects.forEach(obj -> {
try {
Item item = obj.get();
result.add(item.objectName());
} catch (Exception e) {
e.printStackTrace();
}
});
return new ApiResult<>(result);
}
/**
* 下载文件
*/
@GetMapping("/download/{filename}")
public void download(@PathVariable String filename, HttpServletResponse response){
InputStream in = null;
try {
//获取对象信息
StatObjectResponse stat = minioClient.statObject(
StatObjectArgs.builder().bucket(bucketName).object(filename).build());
response.setContentType(stat.contentType());
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(filename, "utf-8"));
//文件下载
in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(filename).build());
IOUtils.copy(in, response.getOutputStream());
}catch (Exception e){
e.getMessage();
}finally {
if(in != null){
try {
in.close();
}catch (IOException e){
e.getMessage();
}
}
}
}
}
minio单机部署
先创建/minio文件夹 再把二进制流的minio文件放在里面(minio通过命令下载 )
然后minio文件夹中创建data文件夹,放后续上传的文件
接下来
输入 chmod +x minio
输入nohup /minio/minio server --address '0.0.0.0:9000' --console-address '0.0.0.0:9001' /minio/data &
Minio的默认地址端口是9000 可以通过--address '0.0.0.0:9000'修改默认端口
如果9000端口被占用可以修改
--console-address '0.0.0.0:9001' 设置静态端口,通过静态端口访问,如果不设置静态端口会有警告,也会导致minio访问失败
访问minio后台可以用默认端口 也可以用静态 http:// ip+端口
登录账号密码 minioadmin minioadmin
修改原始的密码 可以在data的隐藏文件夹中修改,这里就不多说。
进来之后可以在这儿新建桶,来存放文件。
这里可以新增用户,并且授权,minio这一块还是做得非常可以
还有什么东西大家就自己摸索吧,探索才是代码人的乐趣。