Minio HTTP 远程调用上传文件
1,客户端
1,如果你拿到的是byte,需要转成 MultipartFile ,方法如下
byte[] data = xxxxxxxxxx; InputStream inputStream = new ByteArrayInputStream(data); MultipartFile file = new MockMultipartFile(filename,filename2,"image/jpeg", inputStream);
上面的需要引入maven
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>RELEASE</version> </dependency>
2,如果你拿到的是 File或者MultipartFile(File需要转成MultipartFile),可以直接调用
RestTemplate template = new RestTemplate(); String url = "http://127.0.0.1:9999/minio/upload_url"; MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>(); paramMap.add("file", file.getResource()); paramMap.add("boot", "robot"); paramMap.add("path", "/face/tttt/tttt/"); result = template.postForObject(url, paramMap, String.class);
2,服务端
controller
package com.example.miniojava.controller; import com.example.miniojava.service.MinioService; import com.example.miniojava.service.MinioServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; @RestController @RequestMapping("/minio") public class MinioController { /*@Value("${server.port}") private String port;*/ @Autowired private MinioService minioService; @PostMapping("/upload_url") public String upload_url(MultipartFile file,String boot,String path) { if (boot==null || boot.equals("")) return "桶不能为空"; return minioService.uploadFile_url(file,boot,path); } }
MinioServiceImpl
@Service("MinioService") public class MinioServiceImpl implements MinioService { MinioClient minioClient = MinioStarts.minioClientInit(); MinioClient minioClient2 = MinioStarts.minioClientInit2(); /** * 文件上传 能返回图片 * @param file web上传文件接收的参数 * @param path 文件路径 * @return */ public String uploadFile_url(MultipartFile file, String boot, String path) { try { //随机娶一个 if ((Math.random()>0.5?1:0)==0){ // 检查存储桶是否已经存在 boolean isExist = minioClient.bucketExists(boot); if(isExist) { System.out.println("桶已存在通过,执行插入,minio1"); } else { // 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。 minioClient.makeBucket(boot); } InputStream in = file.getInputStream(); String fileName = file.getOriginalFilename();//generalFileName(file.getOriginalFilename()); //minioClient.putObject(boot,path+fileName, file.getInputStream(),file.getContentType()); if (path!=null && !path.equals("null") && !path.equals("")){ minioClient.putObject(boot,path+fileName, file.getInputStream(),file.getContentType()); String aaaa = minioClient.presignedGetObject(boot,path+fileName); //替换域名 aaaa = aaaa.replaceAll("http://127.0.0.1:9000/","https://xxxx.xxxx.com/"); String[] resMax = aaaa.split("\\?"); //minio配置永久不过期后截取?不要后面那一截 return resMax[0]; //return initParam.get("url")+"/"+path+boot+"/"+fileName; }else{ minioClient.putObject(boot,fileName, file.getInputStream(),file.getContentType()); String aaaa = minioClient.presignedGetObject(boot,fileName); aaaa = aaaa.replaceAll("http://127.0.0.1:9000/","https://xxxx.xxxx.com/"); String[] resMax = aaaa.split("\\?"); //minio配置了永久不过期后拿到的返回地址不要?后面那一截 return resMax[0]; } }else{ //第二个minio,用来减轻服务器压力 一样的代码,服务器不同 } } catch (Exception e) { e.printStackTrace(); return "false"; } }
3,minio初始化
package com.example.miniojava.util; import io.minio.MinioClient; import io.minio.errors.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.xmlpull.v1.XmlPullParserException; import java.io.File; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map; /** * yxp * 2021年4月30日17:55:21 */ @Configuration public class MinioStarts { /** * 初始化minio的客户端 * @return */ @Bean public static MinioClient minioClientInit() { try { return new MinioClient("http://127.0.0.1:9000","用户名","密码"); //return new MinioClient(minioUrl,minioUserName,minioPassWord); } catch (InvalidEndpointException e) { e.printStackTrace(); } catch (InvalidPortException e) { e.printStackTrace(); } return null; } }
zzzzzzzzzzzz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)