Java实现Minio上传下载文件

1.导包

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>3.0.10</version>
</dependency>

2.配置minio服务端路径及登录秘钥

minio:
  url: http://localhost:9000
  accessKey: minioadmin
  secretKey: minioadmin

3.上传文件

	@ApiOperation(value = "上传文件")
    @PostMapping("/upload")
    public String upload(MultipartFile file){
        try {
            //minio客户端
            MinioClient minioClient = new MinioClient(url, accessKey, secretKey);
            //校验存储桶是否存在
            boolean isExit = minioClient.bucketExists(bucket);
            if(isExit){
                System.out.println("存储桶已存在!");
            }else{
                //创建一个名为xxn的存储桶,用于存储上传的文件
                minioClient.makeBucket(bucket);
            }
            //获取文件流
            InputStream is = file.getInputStream();
            //获取文件名称
            String filename = file.getOriginalFilename();
            //获取文件类型
            String contentType = file.getContentType();
            //添加文件到(minio)存储桶中
            minioClient.putObject(bucket,filename,is,contentType);
            return filename+"上传成功!";
        } catch (Exception e) {
            e.printStackTrace();
            return "上传失败!";
        }
    }

4.下载文件

	@ApiOperation("下载文件")
    @GetMapping("/download")
    public void download(String filename, HttpServletResponse response){
        try {
            //minio客户端
            MinioClient minioClient = new MinioClient(url, accessKey, secretKey);
            // 调用statObject()来判断对象是否存在。如果不存在, statObject()抛出异常,否则则代表对象存在
            minioClient.statObject(bucket, filename);
            //下载文件流
            BufferedInputStream ism = new BufferedInputStream(minioClient.getObject(bucket, filename));
            byte[] buf = new byte[1024];
            int i=0;
            response.reset();
            response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));
            response.setContentType("application/x-msdownload");
            response.setCharacterEncoding("utf-8");
            BufferedOutputStream osm=new BufferedOutputStream(response.getOutputStream());
            while ((i=ism.read(buf))>0){
                osm.write(buf,0,i);
            }
            osm.flush();
            osm.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
Minio是一个开源的分布式对象存储系统,它允许用户在存储服务上存储和检索数据。它支持S3 API,因此可以与大多数S3兼容的客户端和工具一起使用。 下面是使用Java实现Minio分片上传和下载文件的示例代码: ## 分片上传 ```java import io.minio.MinioClient; import io.minio.errors.MinioException; import io.minio.messages.Part; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; public class MinioUploader { private MinioClient minioClient; private final String bucketName; public MinioUploader(MinioClient minioClient, String bucketName) { this.minioClient = minioClient; this.bucketName = bucketName; } public void upload(String objectName, Path filePath) throws NoSuchAlgorithmException, IOException, MinioException { long fileSize = Files.size(filePath); long partSize = 5 * 1024 * 1024; // 5MB int partCount = (int) Math.ceil((double) fileSize / partSize); List<Part> parts = new ArrayList<>(); for (int i = 0; i < partCount; i++) { int partNumber = i + 1; long offset = i * partSize; long size = Math.min(partSize, fileSize - offset); InputStream inputStream = Files.newInputStream(filePath); inputStream.skip(offset); String uploadId = minioClient.initiateMultipartUpload(bucketName, objectName); Part part = minioClient.uploadPart(bucketName, objectName, uploadId, partNumber, inputStream, size); parts.add(part); } minioClient.completeMultipartUpload(bucketName, objectName, parts); } } ``` ## 分片下载 ```java import io.minio.MinioClient; import io.minio.errors.MinioException; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; import java.security.NoSuchAlgorithmException; import java.util.List; public class MinioDownloader { private MinioClient minioClient; private final String bucketName; public MinioDownloader(MinioClient minioClient, String bucketName) { this.minioClient = minioClient; this.bucketName = bucketName; } public void download(String objectName, Path filePath) throws NoSuchAlgorithmException, IOException, MinioException { long partSize = 5 * 1024 * 1024; // 5MB List<io.minio.messages.Part> parts = minioClient.listObjectParts(bucketName, objectName, null).getParts(); try (BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(filePath.toFile()))) { for (io.minio.messages.Part part : parts) { InputStream inputStream = minioClient.getObject(bucketName, objectName, part.partNumber(), 0L, partSize); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } inputStream.close(); } } } } ``` 这是一个基本的示例,实际使用时需要根据具体需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值