久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    springboot使用minio(8.5.11)-CSDN博客

     jacklopy 2024-09-24 發布于河北

    1.配置minio MinioAutoConfiguration 類

    1. @AllArgsConstructor
    2. @EnableConfigurationProperties({MinioProperties.class})
    3. public class MinioAutoConfiguration {
    4. private final MinioProperties properties;
    5. @Bean
    6. @ConditionalOnMissingBean(MinioTemplate.class)
    7. @ConditionalOnProperty(name = "amc.minio.url")
    8. MinioTemplate minioTemplate() {
    9. return new MinioTemplate(
    10. properties.getUrl(),
    11. properties.getAccessKey(),
    12. properties.getSecretKey()
    13. );
    14. }
    15. }

    2.屬性類

    1. @Data
    2. @ConfigurationProperties(prefix = "amc.minio")
    3. public class MinioProperties {
    4. /**
    5. * minio 服務地址 http://ip:port
    6. */
    7. private String url;
    8. /**
    9. * 用戶名
    10. */
    11. private String accessKey;
    12. /**
    13. * 密碼
    14. */
    15. private String secretKey;
    16. }

    3.創建minioTemplate工具類

    1. package com.amc.minio.entity;
    2. import cn.hutool.core.util.StrUtil;
    3. import cn.hutool.core.util.URLUtil;
    4. import io.minio.*;
    5. import io.minio.errors.*;
    6. import io.minio.http.Method;
    7. import io.minio.messages.Bucket;
    8. import io.minio.messages.Item;
    9. import lombok.RequiredArgsConstructor;
    10. import lombok.SneakyThrows;
    11. import lombok.extern.slf4j.Slf4j;
    12. import org.springframework.beans.factory.InitializingBean;
    13. import org.springframework.util.Assert;
    14. import java.io.IOException;
    15. import java.io.InputStream;
    16. import java.security.InvalidKeyException;
    17. import java.security.NoSuchAlgorithmException;
    18. import java.util.ArrayList;
    19. import java.util.Iterator;
    20. import java.util.List;
    21. import java.util.Optional;
    22. /**
    23. * minio 交互類
    24. * @author Administrator
    25. */
    26. @RequiredArgsConstructor
    27. @Slf4j
    28. public class MinioTemplate implements InitializingBean {
    29. private final String endpoint;
    30. private final String accessKey;
    31. private final String secretKey;
    32. private MinioClient client;
    33. /**
    34. * 創建bucket
    35. *
    36. * @param bucketName bucket名稱
    37. */
    38. @SneakyThrows
    39. public void createBucket(String bucketName) {
    40. if (!client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
    41. client.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
    42. }
    43. }
    44. /**
    45. * 合并分片文件成對象文件
    46. *
    47. * @param chunkBucKetName 分片文件所在存儲桶名稱
    48. * @param composeBucketName 合并后的對象文件存儲的存儲桶名稱
    49. * @param chunkNames 分片文件名稱集合
    50. * @param objectName 合并后的對象文件名稱
    51. * @return true/false
    52. */
    53. @SneakyThrows
    54. public boolean composeObject(String chunkBucKetName, String composeBucketName, List<String> chunkNames, String objectName) {
    55. if (null == chunkBucKetName) {
    56. chunkBucKetName = "chunk";
    57. }
    58. List<ComposeSource> sourceObjectList = new ArrayList<>(chunkNames.size());
    59. for (String chunk : chunkNames) {
    60. sourceObjectList.add(
    61. ComposeSource.builder()
    62. .bucket(chunkBucKetName)
    63. .object(chunk)
    64. .build()
    65. );
    66. }
    67. client.composeObject(
    68. ComposeObjectArgs.builder()
    69. .bucket(composeBucketName)
    70. .object(objectName)
    71. .sources(sourceObjectList)
    72. .build()
    73. );
    74. return true;
    75. }
    76. /**
    77. * 根據md5獲取所有分片文件名稱(minio的文件名稱 = 文件path)
    78. * @param bucketName 桶(文件夾)名稱
    79. * @param prefix 前綴
    80. * @return List<String>
    81. */
    82. @SneakyThrows
    83. public List<String> listObjectNames(String bucketName, String prefix) {
    84. List<String> chunkPaths = new ArrayList<>();
    85. ListObjectsArgs listObjectsArgs;
    86. if (StrUtil.isBlank(prefix)) {
    87. listObjectsArgs = ListObjectsArgs.builder()
    88. .bucket(bucketName)
    89. .recursive(true)
    90. .build();
    91. } else {
    92. listObjectsArgs = ListObjectsArgs.builder()
    93. .bucket(bucketName)
    94. .prefix(prefix)
    95. .recursive(true)
    96. .build();
    97. }
    98. Iterable<Result<Item>> chunks = client.listObjects(listObjectsArgs);
    99. Iterator<Result<Item>> iterator = chunks.iterator();
    100. while(iterator.hasNext()) {
    101. Result<Item> item = iterator.next();
    102. chunkPaths.add(URLUtil.decode(item.get().objectName()));
    103. }
    104. return chunkPaths;
    105. }
    106. /**
    107. * 通過文件名字判斷文件是否存在如果存在返回false否則返回true
    108. * @param bucketName 桶名稱
    109. * @param fileName 文件名稱
    110. * @return true|false
    111. */
    112. @SneakyThrows
    113. public Boolean fileExists(String bucketName, String fileName) {
    114. boolean exist = true;
    115. try {
    116. if(client.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build()) == null){
    117. exist = false;
    118. }
    119. } catch (Exception e) {
    120. exist = false;
    121. }
    122. return exist;
    123. }
    124. /**
    125. * 獲取全部bucket
    126. * <p>
    127. * https://docs./cn/java-client-api-reference.html#listBuckets
    128. */
    129. @SneakyThrows
    130. public List<Bucket> getAllBuckets() {
    131. return client.listBuckets();
    132. }
    133. /**
    134. * @param bucketName bucket名稱
    135. */
    136. @SneakyThrows
    137. public Optional<Bucket> getBucket(String bucketName) {
    138. return client.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();
    139. }
    140. /**
    141. * @param bucketName bucket名稱
    142. */
    143. @SneakyThrows
    144. public Boolean bucketExists(String bucketName) {
    145. return client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
    146. }
    147. /**
    148. * @param bucketName bucket名稱
    149. */
    150. @SneakyThrows
    151. public void removeBucket(String bucketName) {
    152. client.removeBucket(RemoveBucketArgs.builder()
    153. .bucket(bucketName)
    154. .build());
    155. }
    156. /**
    157. * 根據文件前置查詢文件
    158. *
    159. * @param bucketName bucket名稱
    160. * @param prefix 前綴
    161. * @param recursive 是否遞歸查詢
    162. * @return MinioItem 列表
    163. */
    164. @SneakyThrows
    165. public List<MinioItem> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {
    166. List<MinioItem> objectList = new ArrayList<>();
    167. Iterable<Result<Item>> objectsIterator = client.listObjects(ListObjectsArgs.builder()
    168. .bucket(bucketName)
    169. .prefix(prefix)
    170. .recursive(recursive)
    171. .build());
    172. for (Result<Item> itemResult : objectsIterator) {
    173. if(itemResult.get() != null) {
    174. objectList.add(new MinioItem(itemResult.get()));
    175. }
    176. }
    177. return objectList;
    178. }
    179. /**
    180. * 獲取文件外鏈
    181. *
    182. * @param bucketName bucket名稱
    183. * @param objectName 文件名稱
    184. * @param expires 過期時間 <=7
    185. * @return url
    186. */
    187. @SneakyThrows
    188. public String getObjectUrl(String bucketName, String objectName, Integer expires) {
    189. return client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
    190. .method(Method.GET)
    191. .bucket(bucketName)
    192. .object(objectName)
    193. .expiry(expires).build());
    194. }
    195. /**
    196. * 創建上傳文件對象的外鏈
    197. *
    198. * @param bucketName 存儲桶名稱
    199. * @param objectName 欲上傳文件對象的名稱
    200. * @param expiry 過期時間(分鐘) 最大為7天 超過7天則默認最大值
    201. * @return uploadUrl
    202. */
    203. @SneakyThrows
    204. public String createUploadUrl(String bucketName, String objectName, Integer expiry) {
    205. return client.getPresignedObjectUrl(
    206. GetPresignedObjectUrlArgs.builder()
    207. .method(Method.PUT)
    208. .bucket(bucketName)
    209. .object(objectName)
    210. .expiry(expiry)
    211. .build()
    212. );
    213. }
    214. /**
    215. * 獲取文件
    216. *
    217. * @param bucketName bucket名稱
    218. * @param objectName 文件名稱
    219. * @return 二進制流
    220. */
    221. @SneakyThrows
    222. public InputStream getObject(String bucketName, String objectName) {
    223. return client.getObject(GetObjectArgs.builder()
    224. .bucket(bucketName)
    225. .object(objectName).build());
    226. }
    227. /**
    228. * 從指定桶中獲取對象的前綴輸入流
    229. *
    230. * @param bucketName 桶名
    231. * @param objectName 對象名
    232. * @return 讀取對象前1024字節的輸入流,如果發生異常則返回null
    233. */
    234. public InputStream getPerfixInputStream(String bucketName, String objectName){
    235. // 讀取文件的前1024字節
    236. // 你可以根據需要調整這個值
    237. long size = 1024;
    238. try {
    239. return client.getObject(GetObjectArgs.builder()
    240. .bucket(bucketName)
    241. // 文件的起始位置
    242. .offset(0L)
    243. // 需要讀取的字節數
    244. .length(size)
    245. .object(objectName).build());
    246. } catch (Exception e) {
    247. log.error(e.getMessage(),e);
    248. }
    249. return null;
    250. }
    251. /**
    252. * 下載到指定位置
    253. *
    254. * @param bucketName bucket名稱
    255. * @param objectName 對象名稱
    256. * @param objectName 文件名稱
    257. * @return 二進制流
    258. */
    259. @SneakyThrows
    260. public void downloadObject(String bucketName, String objectName, String fileName) {
    261. client.downloadObject(DownloadObjectArgs.builder()
    262. .bucket(bucketName)
    263. .object(objectName)
    264. //必須指定文件名
    265. .filename(fileName)
    266. .build());
    267. }
    268. /**
    269. * 復制文件
    270. *
    271. * @param srcBucketName Source bucket name
    272. * @param srcObjectName Source object name
    273. * @param bucketName 目標 bucket名稱
    274. * @param objectName 目標 文件名稱
    275. * @return 二進制流
    276. */
    277. @SneakyThrows
    278. public void copyObject(String srcBucketName, String srcObjectName, String bucketName, String objectName) {
    279. client.copyObject(CopyObjectArgs.builder()
    280. .source(CopySource.builder()
    281. .bucket(srcBucketName)
    282. .object(srcObjectName)
    283. .build())
    284. .bucket(bucketName)
    285. .object(objectName)
    286. .build());
    287. }
    288. /**
    289. * 上傳文件
    290. *
    291. * @param bucketName bucket名稱
    292. * @param objectName 文件名稱
    293. * @param stream 文件流
    294. * @throws Exception https://docs./cn/java-client-api-reference.html#putObject
    295. */
    296. public void putObject(String bucketName, String objectName, InputStream stream) throws Exception {
    297. putObject(bucketName, objectName, stream, (long) stream.available(), "application/octet-stream");
    298. }
    299. /**
    300. * 上傳文件
    301. *
    302. * @param bucketName bucket名稱
    303. * @param objectName 文件名稱
    304. * @param stream 文件流
    305. * @param size 大小
    306. * @param contextType 類型
    307. * @throws Exception https://docs./cn/java-client-api-reference.html#putObject
    308. */
    309. public void putObject(String bucketName, String objectName, InputStream stream, long size, String contextType) throws Exception {
    310. client.putObject(
    311. PutObjectArgs.builder()
    312. .bucket(bucketName)
    313. .object(objectName).stream(stream, size, -1)
    314. .contentType(contextType)
    315. .build());
    316. }
    317. /**
    318. * 獲取文件信息
    319. *
    320. * @param bucketName bucket名稱
    321. * @param objectName 文件名稱
    322. * @throws Exception https://docs./cn/java-client-api-reference.html#statObject
    323. */
    324. /*public ObjectStat getObjectInfo(String bucketName, String objectName) throws Exception {
    325. return client.statObject(
    326. StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
    327. }*/
    328. /**
    329. * 刪除文件
    330. *
    331. * @param bucketName bucket名稱
    332. * @param objectName 文件名稱
    333. */
    334. @SneakyThrows
    335. public void removeObject(String bucketName, String objectName) {
    336. client.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
    337. }
    338. /**
    339. * 刪除文件
    340. *
    341. * @param bucketName bucket名稱
    342. * @param fileNames 文件名稱列表
    343. * @throws Exception https://docs./cn/java-client-api-reference.html#removeObject
    344. */
    345. @SneakyThrows
    346. public void removeObjects(String bucketName, List<String> fileNames) {
    347. fileNames.forEach(objectName -> {
    348. try {
    349. client.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
    350. } catch (Exception e) {
    351. log.error(e.getMessage(),e);
    352. }
    353. });
    354. }
    355. /**
    356. * 刪除文件
    357. *
    358. * @param bucketName bucket名稱
    359. * @param fileNamePre 標識符
    360. * @throws Exception https://docs./cn/java-client-api-reference.html#removeObject
    361. */
    362. @SneakyThrows
    363. public void removeObjects(String bucketName, String fileNamePre) {
    364. final List<String> listObjectNames = this.listObjectNames(bucketName, fileNamePre);
    365. this.removeObjects(bucketName,listObjectNames);
    366. }
    367. @Override
    368. public void afterPropertiesSet() throws Exception {
    369. Assert.hasText(endpoint, "Minio url 為空");
    370. Assert.hasText(accessKey, "Minio accessKey為空");
    371. Assert.hasText(secretKey, "Minio secretKey為空");
    372. this.client = MinioClient.builder()
    373. .endpoint(endpoint)
    374. .credentials(accessKey, secretKey)
    375. .build();
    376. }
    377. }

    4.初始化桶類

    1. @Slf4j
    2. public class MinioBucketInit implements Runnable{
    3. /**
    4. 算法文件存放的minio桶
    5. */
    6. public String[] buckets;
    7. private MinioTemplate minioTemplate;
    8. public MinioBucketInit(MinioTemplate minioTemplate,String[] buckets) {
    9. this.minioTemplate = minioTemplate;
    10. this.buckets = buckets;
    11. }
    12. @Override
    13. public void run() {
    14. if(buckets==null) {
    15. return;
    16. }
    17. for (int i = 0; i <buckets.length ; i++) {
    18. //判斷桶是否存在
    19. Boolean bucketNameExit = minioTemplate.bucketExists(buckets[i]);
    20. if(!bucketNameExit){
    21. minioTemplate.createBucket(buckets[i]);
    22. }
    23. }
    24. }
    25. }

    5.使用

    1. log.debug("初始化minio的桶");
    2. //判斷有沒有桶
    3. threadPoolTaskExecutor.execute(new MinioBucketInit(minioTemplate,new String[]{bucketName}));
    1. //獲取源文件
    2. InputStream inputStream = minioTemplate.getObject(attachment.getBucketName(), attachment.getFilePath());
    3. //判斷文件是否存在
    4. Boolean fileExists = minioTemplate.fileExists(attachment.getBucketName(), attachment.getFilePath());
    5. //上傳文件到minio
    6. minioTemplate.putObject(MinioBucketInit.ALGORITH_MBUCKET, path, inputStream);

    6.注意

    1.上傳時如果流是空的,不上傳不成功的

    文章知識點與官方知識檔案匹配,可進一步學習相關知識
    Java技能樹NIONIO概述151370 人正在系統學習中

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 无码人妻一区二区三区四区AV| 9色国产深夜内射| 天天躁日日躁狠狠躁2018| 不卡高清AV手机在线观看| 白丝乳交内射一二三区| 国产精品爆乳在线播放第一人称 | 国精产品一区二区三区有限公司| 亚洲一二三区精品美妇| 色婷婷久久综合中文久久一本| 日韩乱码人妻无码中文字幕视频| 亚洲乳大丰满中文字幕| 国产午夜影视大全免费观看| 又爽又黄又无遮挡的激情视频| 一本精品99久久精品77| 亚洲人成网站免费播放| 国产精品中文字幕日韩| V一区无码内射国产| 成年女人片免费视频播放A| 免费无码国产欧美久久18| 成人拍拍拍无遮挡免费视频| 99精品国产在热久久婷婷| 亚洲精品无码久久千人斩| 国产精品未满十八禁止观看| 做暖暖视频在线看片免费| 欧洲亚洲精品免费二区| 国产男女性潮高清免费网站| 伊人久久大香线蕉AV网禁呦| 中文人妻av高清一区二区| 免费人成在线观看网站| 亚洲性日韩精品一区二区三区| 虎白女粉嫩尤物福利视频| 欧乱色国产精品兔费视频| 亚洲人成网线在线播放VA | 精品久久人妻AV中文字幕| 日本怡春院一区二区三区| 福利一区二区在线播放 | 亚洲欧洲日产国码AV天堂偷窥| 国产中文字幕精品免费| 国产精品乱码久久久久久软件| 久久毛片少妇高潮| 午夜免费无码福利视频|