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

cnblogs 2024-10-25 12:39:00 阅读 73

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

<code>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);code>

//上传文件到 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);

}

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。