springboot-上传文件到minio

  1. application.yml

    minio:
      # 地址
      endpoint: http://192.168.6.133:9000/
      # 账号
      accessKey: admin
      # 密码
      secretKey: 123456789
    
  2. UploadMinioConfig.java

    import io.minio.MinioClient;
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author Genius
     * @version 1.0.0
     * @ClassName UploadMinioConfig.java
     * @Description TODO Minio文件服务配置类
     * @createTime 2021年11月22日 20:29:00
     */
    
    @Data
    @Configuration
    @ConfigurationProperties(prefix = "minio")
    public class UploadMinioConfig {
    
        private String endpoint;
        private String accessKey;
        private String secretKey;
    
        @Bean
        public MinioClient minioClient(){
            return MinioClient.builder()
                    .endpoint(endpoint)
                    .credentials(accessKey, secretKey)
                    .build();
        }
    }
    
  3. UploadMinioUtil.java

    import io.minio.*;
    import io.minio.http.Method;
    import io.minio.messages.Bucket;
    import io.minio.messages.DeleteError;
    import io.minio.messages.DeleteObject;
    import io.minio.messages.Item;
    import org.springframework.stereotype.Component;
    import org.springframework.util.FastByteArrayOutputStream;
    import org.springframework.web.multipart.MultipartFile;
    import javax.annotation.Resource;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
    
    /**
     * @author Genius
     * @version 1.0.0
     * @ClassName UploadMinio.java
     * @Description TODO 上传文件到 Minio
     * @createTime 2021年11月22日 20:16:00
     */
    @Component
    public class UploadMinio {
        // 将要上传的bucket存储空间
        static String bucketName = "angel-images";
    
        @Resource
        private MinioClient minioClient;
    
    
        public String fileRename(MultipartFile file){
            // 获取原文件名 + 时间戳(System.currentTimeMillis()),作为上传文件的文件名
            // 分割字符串
            String[] circleSp = file.getOriginalFilename().split("\\.");
            //形成新的文件名
            String name = circleSp[0] + System.currentTimeMillis() + "." + circleSp[1];
    
            System.out.println(name);
            return name;
        }
    
        /**
         * 查看存储bucket是否存在
         * @return boolean
         */
        public Boolean bucketExists(String bucketName) {
            Boolean found;
            try {
                found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            } catch (Exception e) {
                //e.printStackTrace();
                return false;
            }
            return found;
        }
    
        /**
         * 创建存储bucket
         * @return Boolean
         */
        public Boolean makeBucket(String bucketName) {
            try {
                minioClient.makeBucket(MakeBucketArgs.builder()
                        .bucket(bucketName)
                        .build());
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
        /**
         * 删除存储bucket
         * @return Boolean
         */
        public Boolean removeBucket(String bucketName) {
            try {
                minioClient.removeBucket(RemoveBucketArgs.builder()
                        .bucket(bucketName)
                        .build());
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
        /**
         * 获取全部bucket
         */
        public List<Bucket> getAllBuckets() {
            try {
                return minioClient.listBuckets();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 文件上传
         * @param file 文件
         * @return Boolean
         */
        public Boolean upload(MultipartFile file,String fileName) {
    
            try {
                PutObjectArgs objectArgs = PutObjectArgs.builder()
                                            .bucket(bucketName)
                                            .object(fileName)
                                            .contentType(file.getContentType())
                                            .stream(file.getInputStream(),file.getSize(),0)
                                            .build();
                //文件名称相同会覆盖
                minioClient.putObject(objectArgs);
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        /**
         * 预览图片
         * @param fileName
         * @return
         */
        public String preview(String fileName){
            // 查看文件地址
            GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(bucketName).object(fileName).method(Method.GET).build();
            try {
                String url = minioClient.getPresignedObjectUrl(build);
                return url;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 文件下载
         * @param fileName 文件名称
         * @param res response
         * @return Boolean
         */
        public void download(String fileName, HttpServletResponse res) {
            GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName)
                    .object(fileName).build();
            try (GetObjectResponse response = minioClient.getObject(objectArgs)){
                byte[] buf = new byte[1024];
                int len;
                try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){
                    while ((len=response.read(buf))!=-1){
                        os.write(buf,0,len);
                    }
                    os.flush();
                    byte[] bytes = os.toByteArray();
                    res.setCharacterEncoding("utf-8");
                    //设置强制下载不打开
                    //res.setContentType("application/force-download");
                    res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
                    try (ServletOutputStream stream = res.getOutputStream()){
                        stream.write(bytes);
                        stream.flush();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 查看文件对象
         * @return 存储bucket内文件对象信息
         */
        public List<Item> listObjects() {
            Iterable<Result<Item>> results = minioClient.listObjects(
                    ListObjectsArgs.builder().bucket(bucketName).build());
            List<Item> items = new ArrayList<>();
            try {
                for (Result<Item> result : results) {
                    items.add(result.get());
                }
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            return items;
        }
    
        /**
         * 删除
         * @param fileName
         * @return
         * @throws Exception
         */
        public boolean remove(String fileName){
            try {
                minioClient.removeObject( RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
            }catch (Exception e){
                return false;
            }
            return true;
        }
    
        /**
         * 批量删除文件对象(没测试)
         * @param objects 对象名称集合
         */
        public Iterable<Result<DeleteError>> removeObjects(List<String> objects) {
            List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
            Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
            return results;
        }
    
    }
    
以下是在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的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值