图像分片上传到 MinIO 文档

本文详细介绍了如何通过Java将图片分片并上传到MinIO服务器,以提高上传效率和利用其分布式存储。包括连接服务器、读取图像、分片处理、上传切片以及注意事项
摘要由CSDN通过智能技术生成

1. 简介

本文档详细描述了如何将一张图像进行分片,并将每个切片上传到 MinIO 服务器上的过程。通过将图像分片,可以更有效地上传大型图像文件,同时利用 MinIO 的分布式存储能力进行存储和管理。

2. 实现步骤
 

2.1 准备工作

在开始之前,请确保你已经安装了 Java 开发环境,并且已经将 MinIO Java 客户端库添加到你的项目依赖中。


2.2 连接到 MinIO 服务器

首先,我们创建一个 MinioClient 实例,连接到 MinIO 服务器。在这个例子中,我们使用了默认的 MinIO 服务器地址(http://127.0.0.1:9000)、访问密钥和秘密密钥。

// 创建 MinioClient 实例
        MinioClient minioClient = MinioClient.builder()
                .endpoint(ENDPOINT)
                .credentials(ACCESS_KEY, SECRET_KEY)
                .build();

2.3 读取原始图像并分片

我们使用 Java 的 ImageIO 类来读取原始图像,并将其分成指定数量的切片。在本例中,我们将图像沿水平方向分成了 4 个切片。

javaCopy code// 读取原始图像
BufferedImage originalImage = ImageIO.read(file);

// 定义切片数量
int sliceCount = 4; // 水平切片数量

// 计算切片高度
int sliceHeight = originalImage.getHeight() / sliceCount;

2.4 上传切片到 MinIO

接下来,我们将每个切片上传到 MinIO 服务器。为了更好地组织和管理切片,我们将它们上传到一个以当前分钟数为名称的目录下。

javaCopy code// 上传切片到 MinIO
minioClient.uploadObject(
        UploadObjectArgs.builder()
                .bucket(bucketName)
                .object(objectName)
                .filename(outputfile.getAbsolutePath())
                .build());

2.5 清理本地文件

最后,我们删除本地保存的切片文件,释放本地存储空间,并确保不会在本地留下不必要的文件。

javaCopy code// 删除本地切片文件
outputfile.delete();

3. 注意事项

  • 在实际应用中,你可能需要添加更多的错误处理和异常处理代码,以确保程序的健壮性和稳定性。
  • 这个示例中使用的是默认的 MinIO 服务器地址、访问密钥和秘密密钥。在实际应用中,请根据你的实际情况修改这些参数。
  • 请确保你的 MinIO 服务器已经正确配置并且可用。

4. 结论

通过本文档的示例,你学会了如何将一张图像分片并上传到 MinIO 服务器。通过将图像分片,可以更有效地处理大型图像文件,并且利用 MinIO 的分布式存储能力进行存储和管理。

5. 测试用例

6. 完整代码


/**
 * minio实现分片上传
 */
public class MInioSharding {
    // MinIO服务器的地址
    private static final String ENDPOINT = "http://127.0.0.1:9000";
    // MinIO服务器的访问密钥
    private static final String ACCESS_KEY = "minioadmin";
    // MinIO服务器的秘密密钥
    private static final String SECRET_KEY = "minioadmin";

    public static void main(String[] args) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        // 创建 MinioClient 实例
        MinioClient minioClient = MinioClient.builder()
                .endpoint(ENDPOINT)
                .credentials(ACCESS_KEY, SECRET_KEY)
                .build();

        // 指定桶名称和上传文件的本地路径
        String bucketName = "picture";
        File file = new File("C:\\Users\\ssr\\Pictures\\pexels-photo-730981.jpeg");
        // 输出目录
        String outputDirectory = "C:\\Users\\ssr\\Pictures\\output";

        // 记录上传开始时间
        long start = System.currentTimeMillis();

        try {
            // 读取原始图像
            BufferedImage originalImage = ImageIO.read(file);

            // 定义切片数量
            int sliceCount = 4; // 水平切片数量

            // 计算切片高度
            int sliceHeight = originalImage.getHeight() / sliceCount;

            // 切割图像并保存切片
            for (int i = 0; i < sliceCount; i++) {
                // 计算当前切片的 y 坐标和高度
                int startY = i * sliceHeight;
                int sliceWidth = originalImage.getWidth();

                // 获取当前切片
                BufferedImage imageSlice = originalImage.getSubimage(0, startY, sliceWidth, sliceHeight);

                // 构造保存路径
                String fileName = "output_slice_" + UUID.randomUUID().toString() + ".jpg";
                String objectName = LocalDateTime.now().getMinuteOfHour() + "/" + fileName;
                File outputfile = new File(outputDirectory, fileName);

                // 将切片保存为 JPG 文件
                ImageIO.write(imageSlice, "jpg", outputfile);

                // 上传切片到MinIO
                minioClient.uploadObject(
                        UploadObjectArgs.builder()
                                .bucket(bucketName)
                                .object(objectName)
                                .filename(outputfile.getAbsolutePath())
                                .build());

                // 删除本地切片文件
                outputfile.delete();

                // 记录上传成功及耗时
                System.out.println("上传成功,耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是在Spring Boot应用程序中实现分片上传文件到Minio的步骤: 1. 添加Minio依赖项 在Maven项目中,添加以下依赖项: ```xml <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.0.2</version> </dependency> ``` 2. 配置Minio访问信息 在application.properties或application.yml文件中添加以下配置: ``` minio.url=http://localhost:9000 minio.accessKey=your-access-key minio.secretKey=your-secret-key minio.bucketName=your-bucket-name ``` 3. 创建Minio客户端 在需要使用Minio的地方创建一个Minio客户端实例: ```java @Autowired private MinioProperties minioProperties; @Bean public MinioClient minioClient() { return MinioClient.builder() .endpoint(minioProperties.getUrl()) .credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey()) .build(); } ``` 4. 分片上传文件 使用Minio客户端实例进行分片上传: ```java @Autowired private MinioClient minioClient; public void uploadFile(String filePath, String objectName) throws Exception { // 设置分片大小为5MB final int PART_SIZE = 5 * 1024 * 1024; // 初始化一个MultiPartUpload,获取uploadId String uploadId = minioClient.initiateMultipartUpload(InitiateMultipartUploadArgs.builder() .bucket(minioProperties.getBucketName()) .object(objectName) .build()).uploadId(); try (FileInputStream fileInputStream = new FileInputStream(filePath)) { // 初始化一个PartETag列表,用于存储每个分片的ETag List<PartETag> partETags = new ArrayList<>(); long fileLength = new File(filePath).length(); // 计算分片数量 int partCount = (int) Math.ceil(fileLength * 1.0 / PART_SIZE); for (int i = 0; i < partCount; i++) { long partSize = Math.min(PART_SIZE, fileLength - i * PART_SIZE); // 上传分片,获取ETag PartETag partETag = minioClient.uploadPart(UploadPartArgs.builder() .bucket(minioProperties.getBucketName()) .object(objectName) .uploadId(uploadId) .partNumber(i + 1) .contentLength(partSize) .md5(HashUtil.md5Hex(fileInputStream, partSize)) .build(), fileInputStream, partSize); partETags.add(partETag); } // 完成分片上传 minioClient.completeMultipartUpload(CompleteMultipartUploadArgs.builder() .bucket(minioProperties.getBucketName()) .object(objectName) .uploadId(uploadId) .partETags(partETags) .build()); } } ``` 上述代码中使用了HashUtil类计算文件分片的MD5值。这个类可以自己实现或者使用commons-codec库。 5. 下载文件 使用Minio客户端实例进行文件下载: ```java @Autowired private MinioClient minioClient; public void downloadFile(String objectName, String filePath) throws Exception { minioClient.downloadObject(DownloadObjectArgs.builder() .bucket(minioProperties.getBucketName()) .object(objectName) .build(), Paths.get(filePath)); } ``` 这些就是在Spring Boot应用程序中实现分片上传文件到Minio的基本步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值