MinIO上传和下载文件及文件完整性校验.

打印 上一主题 下一主题

主题 863|帖子 863|积分 2589

MinIO上传和下载文件及文件完整性校验.
  1. package com.xuecheng.media;
  2. import com.j256.simplemagic.ContentInfo;
  3. import com.j256.simplemagic.ContentInfoUtil;
  4. import io.minio.*;
  5. import io.minio.errors.*;
  6. import org.apache.commons.codec.digest.DigestUtils;
  7. import org.apache.commons.io.IOUtils;
  8. import org.junit.jupiter.api.Test;
  9. import org.springframework.boot.test.context.SpringBootTest;
  10. import org.springframework.http.MediaType;
  11. import java.io.*;
  12. import java.util.HashMap;
  13. import java.util.Map;
  14. /**
  15. * 测试minio的sdk
  16. *
  17. * @author ManolinCoder
  18. * @date 2024-10-21
  19. */
  20. @SpringBootTest
  21. public class MinioTest {
  22.     // MinIO服务器地址
  23.     String url = "http://localhost:9000";
  24.     // MinIO访问密钥
  25.     String accessKey = "accessKey";
  26.     // MinIO秘密密钥
  27.     String secretKey = "secretKey";
  28.     // 待上传的文件路径
  29.     String filePath = "/Users/lcm/Movies/测试视频/1.mp4";
  30.     // MinIO存储桶名称
  31.     String bucketName = "testbucket";
  32.     // 存储桶中的对象名称
  33.     String objectName = "1.mp4";
  34.     MinioClient minioClient = MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
  35.     /**
  36.      * 上传文件
  37.      *
  38.      * @param
  39.      * @return void
  40.      * @author ManolinCoder
  41.      * @date 2024-10-21
  42.      */
  43.     @Test
  44.     public void testUpload() throws Exception {
  45.         ContentInfo extensionMatch = ContentInfoUtil.findExtensionMatch(".mp4");
  46.         String mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE;  // 通用 mimeType 字节流
  47.         if (extensionMatch != null) {
  48.             mimeType = extensionMatch.getMimeType();
  49.         }
  50.         try {
  51.             // Make 'asiatrip' bucket if not exist.
  52.             boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("testbucket").build());
  53.             if (!found) {
  54.                 // Make a new bucket called 'asiatrip'.
  55.                 minioClient.makeBucket(MakeBucketArgs.builder().bucket("testbucket").build());
  56.             } else {
  57.                 System.out.println("文件桶已存在!!!");
  58.             }
  59.             // 上传文件
  60.             uploadFile(minioClient, filePath, bucketName, objectName, mimeType);
  61.             //上传文件完整性校验
  62.             boolean flag = checkFileIntegrity(minioClient, filePath, bucketName, objectName);
  63.             System.out.println(flag ? "上传文件成功了!!!" : "上传文件失败了!!!");
  64.         } catch (MinioException e) {
  65.             System.out.println("Error occurred: " + e);
  66.             System.out.println("HTTP trace: " + e.httpTrace());
  67.         }
  68.     }
  69.     /**
  70.      * 删除文件
  71.      *
  72.      * @param
  73.      * @return void
  74.      * @author ManolinCoder
  75.      * @date 2024-10-21
  76.      */
  77.     @Test
  78.     public void testDelete() throws Exception {
  79.         RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket("testbucket").object("1.MP4").build();
  80.         minioClient.removeObject(removeObjectArgs);
  81.     }
  82.     /**
  83.      * 查询文件,下载到本地
  84.      *
  85.      * @param
  86.      * @return void
  87.      * @author ManolinCoder
  88.      * @date 2024-10-21
  89.      */
  90.     @Test
  91.     public void testGetObject() throws Exception {
  92.         GetObjectArgs getObjectArgs = GetObjectArgs.builder().bucket("testbucket").object("1.MP4").build();
  93.         FilterInputStream inputStream = minioClient.getObject(getObjectArgs);
  94.         String localFileName = "/Users/lcm/Downloads/1.mp4";
  95.         // 指定输出流
  96.         FileOutputStream outputStream = new FileOutputStream(new File(localFileName));
  97.         IOUtils.copy(inputStream, outputStream);
  98.         // md5完整性校验
  99.         boolean flag = checkFileIntegrity(minioClient, localFileName, bucketName, objectName);
  100.         if (flag) {
  101.             System.out.println("下载成功了!!!");
  102.         } else {
  103.             System.out.println("下载失败了!!!");
  104.         }
  105.     }
  106.     /**
  107.      * 上传文件
  108.      *
  109.      * @param minioClient
  110.      * @param filePath
  111.      * @param bucketName
  112.      * @param objectName
  113.      * @param contentType
  114.      * @return void
  115.      * @author CoderManolin
  116.      * @date 2024-10-25
  117.      */
  118.     public void uploadFile(MinioClient minioClient, String filePath, String bucketName, String objectName, String contentType) throws Exception {
  119.         // 计算上传前本地文件MD5
  120.         String uploadLocalFileMD5 = calculateMD5(filePath);
  121.         System.out.println("上传前本地文件MD5: uploadLocalFileMD5=" + uploadLocalFileMD5);
  122.         Map<String, String> md5Map = new HashMap<>();
  123.         md5Map.put("md5", uploadLocalFileMD5);
  124.         //上传文件到 MinIO
  125.         File file = new File(filePath);
  126.         minioClient.putObject(
  127.                 PutObjectArgs.builder()
  128.                         .bucket(bucketName)
  129.                         .object(objectName)
  130.                         .stream(new FileInputStream(file), file.length(), -1)
  131.                         .userMetadata(md5Map)
  132.                         .contentType(contentType)
  133.                         .build()
  134.         );
  135.         System.out.println("File uploaded successfully: " + objectName);
  136.     }
  137.     /**
  138.      * 计算md5
  139.      *
  140.      * @param filePath
  141.      * @return File
  142.      * @author ManolinCoder
  143.      * @date 2024-10-23
  144.      */
  145.     public String calculateMD5(String filePath) throws Exception {
  146.         FileInputStream fileInputStream = new FileInputStream(filePath);
  147.         return DigestUtils.md5Hex(fileInputStream);
  148.     }
  149.     /**
  150.      * 对比本地文件和minio文件的MD5值是否一致,校验文件完整性
  151.      *
  152.      * @param minioClient
  153.      * @param filePath
  154.      * @param bucketName
  155.      * @param objectName
  156.      * @return boolean
  157.      * @author CoderManolin
  158.      * @date 2024-10-25
  159.      */
  160.     public boolean checkFileIntegrity(MinioClient minioClient, String filePath, String bucketName, String objectName) throws Exception {
  161.         // 计算本地文件的MD5
  162.         String localFileMD5 = calculateMD5(filePath);
  163.         System.out.println("Local file MD5: " + localFileMD5);
  164.         // 获取MinIO中对象的MD5
  165.         StatObjectResponse stat = minioClient.statObject(
  166.                 StatObjectArgs.builder()
  167.                         .bucket(bucketName)
  168.                         .object(objectName)
  169.                         .build());
  170.         String minioFileMD5 = stat.userMetadata().get("md5");
  171.         System.out.println("MinIO file MD5: " + minioFileMD5);
  172.         // 比较MD5值
  173.         return localFileMD5.equals(minioFileMD5);
  174.     }
  175. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表