首页 > 其他分享 >MinIO上传和下载文件及文件完整性校验.

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

时间:2024-10-25 12:32:43浏览次数:1  
标签:文件 String filePath 校验 param import minioClient 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);


    }

}

标签:文件,String,filePath,校验,param,import,minioClient,MinIO
From: https://www.cnblogs.com/mingcoder/p/18502263

相关文章

  • C++ 内存管理 堆和栈、内存泄漏、内存分配、指针与内存、智能指针、malloc和free、new
    1.堆和栈的区别1.**管理方式**:-**栈**:自动管理。当函数调用时,局部变量会自动分配在栈上。函数执行完毕后,这些变量会自动释放。-**堆**:手动管理。程序员需要使用`new`来在堆上分配内存,并在不再需要时使用`delete`来释放。2.**使用方式和寿命**:-**栈**:用......
  • 060 单文件组件
    Vue的单文件组件用.vue结尾单文件组件的格式如下:别忘了template标签是不参与编译的,最后在页面上不显示School组件vue结构快捷键<vapp组件main.jsindex.html准备容器如果想在容器中什么都不写,调整main.js......
  • 织梦数据库保存文件在哪里?织梦数据库怎么连接
    不同版本的织梦CMS数据库连接文件的位置和内容有所不同。以下是各版本的具体位置和配置文件内容:各版本数据库连接文件位置织梦CMSV5.1:include/config_base.php织梦CMSV5.3:data/common.inc.php织梦CMSV5.5:data/common.inc.php织梦CMSV5.6:data/common.inc.php数据库连接......
  • 为什么有些编程语言不建议用下划线作为标识符开头?标识符的特殊字符。为什么不指定编
    为什么有些编程语言不建议用下划线作为标识符开头?C/C++中两个下划线开头的标识符可能是预留给运行时库的保留字。写代码的时候,就建议最好不要用下划线开头的标识符,避免冲突。最怕的是,编译器没提示错误,运行时产生奇怪的结果。......
  • Robot文件是告诉搜索引擎的蜘蛛,网站的哪些文件目录可以爬获取,哪些目录不要爬获取
    robots.txt 文件用于告诉搜索引擎哪些页面可以被抓取,哪些页面不可以被抓取。以下是如何创建和配置 robots.txt 文件的步骤:创建 robots.txt 文件打开文本编辑器:使用任何文本编辑器(如Notepad、SublimeText、VSCode等)创建一个新的文本文件。编写 robots.txt 内......
  • PbootCMS后台自动清理缓存runtime文件夹
    PbootCMS后台自动清理缓存进入后台管理:登录PbootCMS后台管理系统。配置自动清理缓存:进入“系统设置”->“缓存管理”。找到“自动清理缓存”选项,设置自动清理的时间间隔。保存设置。详细步骤方式一:通过后台清理缓存登录后台:打开浏览器,输入你的PbootCMS后......
  • springboot工程,在pom.xml文件中,排除了打包application.yml文件后,运行项目报错的问题
    1、排除掉application.yml文件(maven编译是没有问题的) 2、但是在idea中运行项目,会报 Errorcreatingbeanwithname'loginInterceptor':Unsatisfieddependencyexpressedthroughfield'jwtUtil';nestedexceptionisorg.springframework.beans.factory.BeanCreatio......
  • 使用mysqlbinlog 备份 binlog日志文件
    使用mysqlbinlog备份二进制日志文件默认情况下,mysqlbinlog读取二进制日志文件并以文本格式显示其内容。这使您能够更轻松地检查文件中的事件并重新执行它们(例如,通过将输出用作mysql的输入)。mysqlbinlog可以直接从本地文件系统读取日志文件,或者,--read-from-remote-server它可......
  • 网关点表&&全局点表json文件使用(拓展性实现方法)
    全局点表点表作用每一个网关中都会有配置点表,它会在里面写入一些网关运行过程中所需要的配置项,比如连接的服务器地址、当前固件版本号等。而点表最重要的作用就是定义网关需要采集或者处理的设备点抽象,实际开发中我们会将每个需要关注的终端设备抽象成一个具体的数据点,这......
  • 适用于 Windows 11/10 电脑 的 13 个最佳文件恢复软件
    如果您由于系统故障、硬件损坏、人为错误或病毒攻击而丢失了重要文件或文件夹。不用担心,因为我们随时为您提供帮助!借助正确的文件恢复工具,您可以立即检索计算机上不同类型的文件。如果你有为您的文件创建备份,你不用担心,但是如果你没有备份怎么办?然后,您需要获得适用于Windows1......