SpringBoot整合Minio的示例代碼
SpringBoot整合Minio
進入Minio官網(wǎng),下載對應(yīng)的Minio版本
下載完成之后,啟動(windows版)
minio.exe server D:\minio\server
minio.exe server:啟動服務(wù)
D:\minio\server:設(shè)置上傳圖片存儲路徑
API:上傳圖片鏈接(端口默認(rèn)9000)
RootUser:賬號
RootPass:密碼
Console:控制臺地址
訪問控制臺地址:http://192.168.1.15:50932 進入控制臺
創(chuàng)建存儲桶
引入依賴
<!--minio--> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.0.3</version> </dependency>
yml配置
server: port: 8099 spring: # 配置文件上傳大小限制 servlet: multipart: max-file-size: 200MB max-request-size: 200MB minio: #文件上傳接口 endpoint: http://127.0.0.1:9000 accessKey: minioadmin secretKey: minioadmin #存儲通名稱 bucketName: img
配置類(注冊minio客戶端)
@Data @Component public class MinIoClientConfig { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secreKey; /** * 注入minio客戶端 * @return */ @Bean public MinioClient minioClient(){ return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey,secreKey) .build(); } }
工具類
/** * 功能描述:MinioUtils * * @author: sc * @Date: 2022/12/27 * @Time: 10:26 */ @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)建存儲bucket * @param bucketName 存儲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; } /** * 刪除存儲bucket * @param bucketName 存儲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; } /** * 查看文件對象 * @param bucketName 存儲bucket名稱 * @return 存儲bucket內(nèi)文件對象信息 */ 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; } /** * 批量刪除文件對象 * @param bucketName 存儲bucket名稱 * @param objects 對象名稱集合 */ 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; } }
實體類
/** * 功能描述: * * @author: sc * @Date: 2022/12/27 * @Time: 10:25 */ @Data public class ObjectItem { private String objectName; private Long size; }
編寫Controller
/** * 功能描述: * * @author: sc * @Date: 2022/12/27 * @Time: 10:35 */ @RestController public class MinioController { @Resource private MinioUtils minioUtils; @Value("${minio.endpoint}") private String address; @Value("${minio.bucketName}") private String bucketName; /** * 文件上傳 * @param files * @return */ @PostMapping("/upload") public Object upload(MultipartFile[] files){ List<String> uploadUrl = new ArrayList<>(); List<String> upload = minioUtils.upload(files); for (String s : upload) { uploadUrl.add(address+"/"+bucketName+"/"+s); } return uploadUrl; } /** * 移除圖片 * @param imgUrlList * @return */ @PostMapping("/remove") public Object remove(@RequestBody List<String> imgUrlList){ Iterable<Result<DeleteError>> img = minioUtils.removeObjects("img", imgUrlList); return img; } /** * 下載圖片 * @param fileName * @return */ @GetMapping("/download/{fileName}") public Object download(@PathVariable("fileName") String fileName){ ResponseEntity<byte[]> download = minioUtils.download(fileName); return download; } }
到此這篇關(guān)于SpringBoot整合Minio的文章就介紹到這了,更多相關(guān)SpringBoot整合Minio內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+MinIO實現(xiàn)對象存儲的示例詳解
- SpringBoot基于Minio實現(xiàn)分片上傳、斷點續(xù)傳的實現(xiàn)
- springboot?Minio功能實現(xiàn)代碼
- SpringBoot集成MinIO的示例代碼
- SpringBoot + minio實現(xiàn)分片上傳、秒傳、續(xù)傳功能
- SpringBoot整合minio服務(wù)的示例代碼
- SpringBoot使用Minio進行文件存儲的實現(xiàn)
- 可能是全網(wǎng)最詳細的springboot整合minio教程
- Springboot整合minio實現(xiàn)文件服務(wù)的教程詳解
- SpringBoot整合Minio實現(xiàn)上傳文件的完整步驟記錄
- SpringBoot整合MinIO實現(xiàn)文件上傳的方法詳解
- SpringBoot整合minio快速入門教程(代碼示例)
- SpringBoot+MinIO實現(xiàn)文件上傳、讀取、下載、刪除的使用示例
相關(guān)文章
FeignClient如何通過配置變量調(diào)用配置文件url
這篇文章主要介紹了FeignClient如何通過配置變量調(diào)用配置文件url,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06SpringBoot中@ConfigurationProperties注解的使用與源碼詳解
這篇文章主要介紹了SpringBoot中@ConfigurationProperties注解的使用與源碼詳解,@ConfigurationProperties注解用于自動配置綁定,可以將application.properties配置中的值注入到bean對象上,需要的朋友可以參考下2023-11-11Java如何利用LocalDate獲取某個月的第一天與最后一天日期
這篇文章主要給大家介紹了關(guān)于Java如何利用LocalDate獲取某個月的第一天與最后一天日期的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-01-01JSON各種轉(zhuǎn)換問題(json轉(zhuǎn)List,json轉(zhuǎn)對象等)
這篇文章主要介紹了JSON各種轉(zhuǎn)換問題(json轉(zhuǎn)List,json轉(zhuǎn)對象等),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03關(guān)于mybatis plus 中的查詢優(yōu)化問題
這篇文章主要介紹了關(guān)于mybatis plus 中的查詢優(yōu)化問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01詳談@Cacheable不起作用的原因:bean未序列化問題
這篇文章主要介紹了@Cacheable不起作用的原因:bean未序列化問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01minio的下載和springboot整合minio使用方法
本文介紹了如何通過Docker拉取MinIO鏡像,并創(chuàng)建MinIO容器的過程,首先,需要在本地創(chuàng)建/data和/conf兩個目錄用于掛載MinIO的數(shù)據(jù)和配置文件,接下來,通過docker?run命令啟動容器,設(shè)置MinIO的訪問端口、用戶名、密碼等信息,感興趣的朋友一起看看吧2024-09-09springboot項目獲取resources相對路徑的方法
這篇文章主要介紹了springboot項目獲取resources相對路徑的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12