天津储鑫盛钢材现货供应商 发表于 2024-10-25 12:23:00

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

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

package com.xuecheng.media;

import com.j256.simplemagic.ContentInfo;
import com.j256.simplemagic.ContentInfoUtil;
import io.minio.*;
import io.minio.errors.*;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
* 测试minio的sdk
*
* @author ManolinCoder
* @date 2024-10-21
*/


@SpringBootTest
public class MinioTest {


    // MinIO服务器地址
    String url = "http://localhost:9000";
    // MinIO访问密钥
    String accessKey = "accessKey";
    // MinIO秘密密钥
    String secretKey = "secretKey";

    // 待上传的文件路径
    String filePath = "/Users/lcm/Movies/测试视频/1.mp4";
    // MinIO存储桶名称
    String bucketName = "testbucket";
    // 存储桶中的对象名称
    String objectName = "1.mp4";


    MinioClient minioClient = MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();


    /**
   * 上传文件
   *
   * @param
   * @return void
   * @author ManolinCoder
   * @date 2024-10-21
   */
    @Test
    public void testUpload() throws Exception {

      ContentInfo extensionMatch = ContentInfoUtil.findExtensionMatch(".mp4");
      String mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE;// 通用 mimeType 字节流


      if (extensionMatch != null) {
            mimeType = extensionMatch.getMimeType();
      }

      try {

            // Make 'asiatrip' bucket if not exist.
            boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("testbucket").build());
            if (!found) {
                // Make a new bucket called 'asiatrip'.
                minioClient.makeBucket(MakeBucketArgs.builder().bucket("testbucket").build());
            } else {
                System.out.println("文件桶已存在!!!");
            }

            // 上传文件
            uploadFile(minioClient, filePath, bucketName, objectName, mimeType);

            //上传文件完整性校验
            boolean flag = checkFileIntegrity(minioClient, filePath, bucketName, objectName);


            System.out.println(flag ? "上传文件成功了!!!" : "上传文件失败了!!!");


      } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
            System.out.println("HTTP trace: " + e.httpTrace());
      }


    }


    /**
   * 删除文件
   *
   * @param
   * @return void
   * @author ManolinCoder
   * @date 2024-10-21
   */
    @Test
    public void testDelete() throws Exception {

      RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket("testbucket").object("1.MP4").build();

      minioClient.removeObject(removeObjectArgs);


    }


    /**
   * 查询文件,下载到本地
   *
   * @param
   * @return void
   * @author ManolinCoder
   * @date 2024-10-21
   */
    @Test
    public void testGetObject() throws Exception {

      GetObjectArgs getObjectArgs = GetObjectArgs.builder().bucket("testbucket").object("1.MP4").build();

      FilterInputStream inputStream = minioClient.getObject(getObjectArgs);

      String localFileName = "/Users/lcm/Downloads/1.mp4";

      // 指定输出流
      FileOutputStream outputStream = new FileOutputStream(new File(localFileName));
      IOUtils.copy(inputStream, outputStream);

      // md5完整性校验
      boolean flag = checkFileIntegrity(minioClient, localFileName, bucketName, objectName);


      if (flag) {
            System.out.println("下载成功了!!!");
      } else {
            System.out.println("下载失败了!!!");
      }


    }


    /**
   * 上传文件
   *
   * @param minioClient
   * @param filePath
   * @param bucketName
   * @param objectName
   * @param contentType
   * @return void
   * @author CoderManolin
   * @date 2024-10-25
   */
    public void uploadFile(MinioClient minioClient, String filePath, String bucketName, String objectName, String contentType) throws Exception {

      // 计算上传前本地文件MD5
      String uploadLocalFileMD5 = calculateMD5(filePath);
      System.out.println("上传前本地文件MD5: uploadLocalFileMD5=" + uploadLocalFileMD5);
      Map<String, String> md5Map = new HashMap<>();
      md5Map.put("md5", uploadLocalFileMD5);


      //上传文件到 MinIO
      File file = new File(filePath);
      minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(bucketName)
                        .object(objectName)
                        .stream(new FileInputStream(file), file.length(), -1)
                        .userMetadata(md5Map)
                        .contentType(contentType)
                        .build()
      );
      System.out.println("File uploaded successfully: " + objectName);

    }


    /**
   * 计算md5
   *
   * @param filePath
   * @return File
   * @author ManolinCoder
   * @date 2024-10-23
   */
    public String calculateMD5(String filePath) throws Exception {
      FileInputStream fileInputStream = new FileInputStream(filePath);
      return DigestUtils.md5Hex(fileInputStream);
    }


    /**
   * 对比本地文件和minio文件的MD5值是否一致,校验文件完整性
   *
   * @param minioClient
   * @param filePath
   * @param bucketName
   * @param objectName
   * @return boolean
   * @author CoderManolin
   * @date 2024-10-25
   */

    public boolean checkFileIntegrity(MinioClient minioClient, String filePath, String bucketName, String objectName) throws Exception {


      // 计算本地文件的MD5
      String localFileMD5 = calculateMD5(filePath);
      System.out.println("Local file MD5: " + localFileMD5);

      // 获取MinIO中对象的MD5
      StatObjectResponse stat = minioClient.statObject(
                StatObjectArgs.builder()
                        .bucket(bucketName)
                        .object(objectName)
                        .build());

      String minioFileMD5 = stat.userMetadata().get("md5");
      System.out.println("MinIO file MD5: " + minioFileMD5);

      // 比较MD5值
      return localFileMD5.equals(minioFileMD5);


    }

}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MinIO上传和下载文件及文件完整性校验.