文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

对象存储MinIO(实现文件上传、读取、下载、删除)

2023-08-31 21:26

关注

一、 MinIO

        MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服

务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/

虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

        MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者

MySQL。

二、 MinIO安装和启动

       由于MinIO是一个单独的服务器,需要单独部署,有关MinIO在Windows系统上的使用请查看

以下博客。

window10安装minio_angelasp的博客-CSDN博客_win10 安装minio

三、 pom.xml(maven依赖文件)

       org.springframework.boot       spring-boot-starter-web       io.minio       minio       8.3.4

 四、 applicatin.properties(配置文件)

# 设置单个文件大小spring.servlet.multipart.max-file-size= 50MB#minio文件服务器配置s3.url=http://localhost:9000s3.accessKey=admins3.secretKey=admin123s3.bucketName=test

五、 编写Java业务类

minio涉及到的方法有:判断存储桶是否存在,创建存储桶,上传文件,读取文件、下载文件,删

除文件等操作

StorageProperty 存储属性类:

import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;  @Data@Component@ConfigurationProperties(prefix = "s3")public class StorageProperty {    private String url;    private String accessKey;    private String secretKey;//    private long callTimeOut = 60000;//    private long readTimeOut = 300000;}

minio配置类: 

import io.minio.BucketExistsArgs;import io.minio.MinioClient;import io.minio.messages.Bucket;import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;import java.util.List; @Slf4j@Component@Configurationpublic class MinioClientConfig {     @Autowired    private StorageProperty storageProperty;     private static MinioClient minioClient;          public static MinioClient getMinioClient(){        return minioClient;    }         @SneakyThrows(Exception.class)    public static boolean bucketExists(String bucketName) {        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());    }          @SneakyThrows(Exception.class)    public static List getAllBuckets() {        return minioClient.listBuckets();    }         @PostConstruct    public void init() {        try {            minioClient = MinioClient.builder()                    .endpoint(storageProperty.getUrl())                    .credentials(storageProperty.getAccessKey(), storageProperty.getSecretKey())                    .build();        } catch (Exception e) {            e.printStackTrace();            log.error("初始化minio配置异常: 【{}】", e.fillInStackTrace());        }    } }

minio工具类 

import io.minio.*; import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;import java.io.InputStream;import java.nio.charset.StandardCharsets;import java.util.Map; @Slf4j@Componentpublic class MinioUtil {            public ResultEntity> minioUpload(MultipartFile file, String fileName, String bucketName) {        ResultEntity> resultEntity = new ResultEntity();        try {            MinioClient minioClient = MinioClientConfig.getMinioClient();            // fileName为空,说明要使用源文件名上传            if (fileName == null) {                fileName = file.getOriginalFilename();                fileName = fileName.replaceAll(" ", "_");            }            InputStream inputStream = file.getInputStream();            PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName)                    .stream(inputStream, file.getSize(), -1).contentType(file.getContentType()).build();            //文件名称相同会覆盖            minioClient.putObject(objectArgs);            return resultEntity;        } catch (Exception e) {            e.printStackTrace();            return null;        }    }          public boolean bucketExists(String bucketName) {        boolean flag = false;        try {            flag = MinioClientConfig.bucketExists(bucketName);            if (flag) {                return true;            }        } catch (Exception e) {            e.printStackTrace();            return false;        }        return false;    }         public InputStream getFileInputStream(String fileName, String bucketName) {        try {            MinioClient minioClient = MinioClientConfig.getMinioClient();            return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());        } catch (Exception e) {            e.printStackTrace();            log.error(e.getMessage());        }        return null;    }          public void createBucketName(String bucketName) {        try {            if (StringUtils.isBlank(bucketName)) {                return;            }            MinioClient minioClient = MinioClientConfig.getMinioClient();            boolean isExist = MinioClientConfig.bucketExists(bucketName);            if (isExist) {                log.info("Bucket {} already exists.", bucketName);            } else {                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());            }        } catch (Exception e) {            e.printStackTrace();            log.error(e.getMessage());        }    }        public InputStream downloadFile(String bucketName, String originalName, HttpServletResponse response) {        try {            MinioClient minioClient = MinioClientConfig.getMinioClient();            InputStream file = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(originalName).build());            String filename = new String(originalName.getBytes("ISO8859-1"), StandardCharsets.UTF_8);            if (StringUtils.isNotBlank(originalName)) {                filename = originalName;            }            response.setHeader("Content-Disposition", "attachment;filename=" + filename);            ServletOutputStream servletOutputStream = response.getOutputStream();            int len;            byte[] buffer = new byte[1024];            while ((len = file.read(buffer)) > 0) {                servletOutputStream.write(buffer, 0, len);            }            servletOutputStream.flush();            file.close();            servletOutputStream.close();            return file;        } catch (Exception e) {            e.printStackTrace();            return null;        }    }         public void deleteBucketName(String bucketName) {        try {            if (StringUtils.isBlank(bucketName)) {                return;            }            MinioClient minioClient = MinioClientConfig.getMinioClient();            boolean isExist = MinioClientConfig.bucketExists(bucketName);            if (isExist) {                minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());            }        } catch (Exception e) {            e.printStackTrace();            log.error(e.getMessage());        }    }        public void deleteBucketFile(String bucketName) {        try {            if (StringUtils.isBlank(bucketName)) {                return;            }            MinioClient minioClient = MinioClientConfig.getMinioClient();            boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());            if (isExist) {                minioClient.deleteBucketEncryption(DeleteBucketEncryptionArgs.builder().bucket(bucketName).build());            }        } catch (Exception e) {            e.printStackTrace();            log.error(e.getMessage());        }    }         public String getPreviewFileUrl(String bucketName, String fileName) {        try {            MinioClient minioClient = MinioClientConfig.getMinioClient();            return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(fileName).build());        } catch (Exception e) {            e.printStackTrace();            return "";        }    }}

 六、 MinIoController

文件上传、文件读取、文件下载、文件删除接口如下:

@RestController@RequestMapping("/minio")public class MinIoController extends BaseController {     MinioUtil minioUtil = new MinioUtil();         @PostMapping("/uploadFile")    public AjaxResult uploadFile(@RequestBody MultipartFile file) {        MinioClient minioClient = MinioClientConfig.getMinioClient();        if (minioClient == null) {            return AjaxResult.error("连接MinIO服务器失败", null);        }        ResultEntity> result = minioUtil.minioUpload(file, "", "data-enpower");        if (result.getCode() == 0) {            return AjaxResult.success("上传成功");        } else {            return AjaxResult.error("上传错误!!!");        }    }         @RequestMapping("/getRedFile")    public AjaxResult getRedFile(@RequestBody String fileName) {        MinioClient minioClient = MinioClientConfig.getMinioClient();        if (minioClient == null) {            return AjaxResult.error("连接MinIO服务器失败", null);        }        String url = minioUtil.getPreviewFileUrl("data-enpower",fileName);        return AjaxResult.success(url);    }         @RequestMapping("/downloadFile")    public String downloadFile(@RequestParam String fileName, HttpServletResponse response) {        MinioClient minioClient = MinioClientConfig.getMinioClient();        if (minioClient == null) {            return "连接MinIO服务器失败";        }        return minioUtil.downloadFile("data-enpower",fileName,response) != null ? "下载成功" : "下载失败";    }         @PostMapping("/deleteFile")    public String deleteFile(String fileName) {        MinioClient minioClient = MinioClientConfig.getMinioClient();        if (minioClient == null) {            return "连接MinIO服务器失败";        }        boolean flag = minioUtil.deleteFile("data-enpower",fileName);        return flag == true ? "删除成功" : "删除失败";    }  }

对象存储MinIO基本用法

对象存储服务MinIO的基本用法 

https://www.cnblogs.com/hackyle/p/minio-demo.html

 

来源地址:https://blog.csdn.net/ZHOU_VIP/article/details/129195318

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯