可能是全網(wǎng)最詳細(xì)的springboot整合minio教程
對(duì)象存儲(chǔ)服務(wù)OSS(Object Storage Service)是一種海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù),適合存放任意類型的文件。容量和處理能力彈性擴(kuò)展,多種存儲(chǔ)類型供選擇,全面優(yōu)化存儲(chǔ)成本。
安裝minio
1、進(jìn)入官網(wǎng):https://min.io/
我目前安裝的是版本是:
在cmd窗口中,命令行進(jìn)行minio.exe所在的文件夾,輸入如下命令 server后面的地址是你圖片上傳之后的存儲(chǔ)目錄
minio.exe server E:\minio
因?yàn)檫@里api端口是9000,所以下面的yml需要配置9000端口
accessKey和secretKey需要根據(jù)啟動(dòng)的窗口上的值進(jìn)行配置
bucketName這個(gè)需要自己創(chuàng)建
2、啟動(dòng)成功后,訪問(wèn):127.0.0.1:9000/minio,可以進(jìn)入到minio的控制臺(tái)
我們可以在控制臺(tái)創(chuàng)建bucketName,當(dāng)然也可以用代碼創(chuàng)建
create bucket
其實(shí)這個(gè)bucketName就是文件夾的意思,我們要把文件上傳到哪個(gè)bucketName,就是要把文件上傳到對(duì)應(yīng)的目錄下。
如果需要使用minio,他的服務(wù)一定要打開(kāi)。
依賴
<!--minio--> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.0.3</version> </dependency>
yml配置
spring: # 配置文件上傳大小限制 servlet: multipart: max-file-size: 200MB max-request-size: 200MB minio: endpoint: http://127.0.0.1:9000 accessKey: minioadmin secretKey: minioadmin bucketName: test
寫配置類
注冊(cè)minio客戶端,以便在代碼中使用客戶端上傳文件。
@Data @Component public class MinIoClientConfig { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; /** * 注入minio 客戶端 * @return */ @Bean public MinioClient minioClient(){ return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } }
工具類
實(shí)體類:
@Data public class ObjectItem { private String objectName; private Long size; }
/** * @description: minio工具類 * @version:3.0 */ @Component public class MinioUtilS { @Autowired private MinioClient minioClient; @Value("${minio.bucketName}") private String bucketName; /** * description: 判斷bucket是否存在,不存在則創(chuàng)建 * * @return: void */ public void existBucket(String name) { try { boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build()); if (!exists) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build()); } } catch (Exception e) { e.printStackTrace(); } } /** * 創(chuàng)建存儲(chǔ)bucket * @param bucketName 存儲(chǔ)bucket名稱 * @return Boolean */ public Boolean makeBucket(String bucketName) { try { minioClient.makeBucket(MakeBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 刪除存儲(chǔ)bucket * @param bucketName 存儲(chǔ)bucket名稱 * @return Boolean */ public Boolean removeBucket(String bucketName) { try { minioClient.removeBucket(RemoveBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * description: 上傳文件 * * @param multipartFile * @return: java.lang.String */ public List<String> upload(MultipartFile[] multipartFile) { List<String> names = new ArrayList<>(multipartFile.length); for (MultipartFile file : multipartFile) { String fileName = file.getOriginalFilename(); String[] split = fileName.split("\\."); if (split.length > 1) { fileName = split[0] + "_" + System.currentTimeMillis() + "." + split[1]; } else { fileName = fileName + System.currentTimeMillis(); } InputStream in = null; try { in = file.getInputStream(); minioClient.putObject(PutObjectArgs.builder() .bucket(bucketName) .object(fileName) .stream(in, in.available(), -1) .contentType(file.getContentType()) .build() ); } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } names.add(fileName); } return names; } /** * description: 下載文件 * * @param fileName * @return: org.springframework.http.ResponseEntity<byte [ ]> */ public ResponseEntity<byte[]> download(String fileName) { ResponseEntity<byte[]> responseEntity = null; InputStream in = null; ByteArrayOutputStream out = null; try { in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); out = new ByteArrayOutputStream(); IOUtils.copy(in, out); //封裝返回值 byte[] bytes = out.toByteArray(); HttpHeaders headers = new HttpHeaders(); try { headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } headers.setContentLength(bytes.length); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setAccessControlExposeHeaders(Arrays.asList("*")); responseEntity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK); } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } return responseEntity; } /** * 查看文件對(duì)象 * @param bucketName 存儲(chǔ)bucket名稱 * @return 存儲(chǔ)bucket內(nèi)文件對(duì)象信息 */ public List<ObjectItem> listObjects(String bucketName) { Iterable<Result<Item>> results = minioClient.listObjects( ListObjectsArgs.builder().bucket(bucketName).build()); List<ObjectItem> objectItems = new ArrayList<>(); try { for (Result<Item> result : results) { Item item = result.get(); ObjectItem objectItem = new ObjectItem(); objectItem.setObjectName(item.objectName()); objectItem.setSize(item.size()); objectItems.add(objectItem); } } catch (Exception e) { e.printStackTrace(); return null; } return objectItems; } /** * 批量刪除文件對(duì)象 * @param bucketName 存儲(chǔ)bucket名稱 * @param objects 對(duì)象名稱集合 */ public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects) { List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList()); Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build()); return results; } }
控制器
@RestController @Slf4j public class MinioController { @Autowired private MinIoUtil minIoUtil; @Autowired private MinioUtilS minioUtilS; @Value("${minio.endpoint}") private String address; @Value("${minio.bucketName}") private String bucketName; @PostMapping("/upload") public Object upload(MultipartFile file) { List<String> upload = minioUtilS.upload(new MultipartFile[]{file}); return address+"/"+bucketName+"/"+upload.get(0); } }
成功上傳:
總結(jié)
到此這篇關(guān)于springboot整合minio教程的文章就介紹到這了,更多相關(guān)springboot整合minio內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot整合MinIO實(shí)現(xiàn)文件上傳的方法詳解
- springboot整合minio實(shí)現(xiàn)文件上傳與下載且支持鏈接永久訪問(wèn)
- SpringBoot整合Minio實(shí)現(xiàn)文件上傳和讀取功能
- springboot整合minio的超詳細(xì)教程
- SpringBoot整合Minio實(shí)現(xiàn)圖片上傳功能
- 手把手教你SpringBoot輕松整合Minio
- SpringBoot使用minio及配置代碼
- SpringBoot項(xiàng)目集成MinIO全過(guò)程
- SpringBoot封裝MinIO工具的實(shí)現(xiàn)步驟
相關(guān)文章
uploadify上傳及后臺(tái)文件合法性驗(yàn)證的代碼解析
這篇文章主要介紹了uploadify上傳及后臺(tái)文件合法性驗(yàn)證的代碼解析,整段代碼分為后臺(tái)上傳方法,文件合法性驗(yàn)證類,前端上傳js,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11java實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲(1)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單五子棋小游戲的第一部分,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01使用IntelliJ?IDEA創(chuàng)建簡(jiǎn)單的Java?Web項(xiàng)目完整步驟
這篇文章主要介紹了如何使用IntelliJ?IDEA創(chuàng)建一個(gè)簡(jiǎn)單的JavaWeb項(xiàng)目,實(shí)現(xiàn)登錄、注冊(cè)和查看用戶列表功能,使用Servlet和JSP技術(shù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01spring @Validated 注解開(kāi)發(fā)中使用group分組校驗(yàn)的實(shí)現(xiàn)
這篇文章主要介紹了spring @Validated 注解開(kāi)發(fā)中使用group分組校驗(yàn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05java 設(shè)計(jì)模式之依賴倒置實(shí)例詳解
這篇文章主要介紹了java 設(shè)計(jì)模式之依賴倒置,結(jié)合實(shí)例形式詳細(xì)分析了依賴倒置的相關(guān)概念、原理、使用技巧及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-11-11解決IDEA2020 創(chuàng)建maven項(xiàng)目沒(méi)有src/main/java目錄和webapp目錄問(wèn)題
這篇文章主要介紹了IDEA2020 創(chuàng)建maven項(xiàng)目沒(méi)有src/main/java目錄和webapp目錄問(wèn)題解決方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10mybatis執(zhí)行update批量更新時(shí)報(bào)錯(cuò)的解決方案
這篇文章主要介紹了mybatis執(zhí)行update批量更新時(shí)報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03