当前位置:   article > 正文

转载:分布式文件存储系统MinIO入门教程_文件存储 minio

文件存储 minio

一、应用场景:海量非结构化数据存储需求。例如文件、图片、音频、视频等。

二、简介:MinIO是一个基于Apache License V2.0开源协议的对象存储服务

三、基础概念:

Object: 存储到MinIO的基本对象,如文件、字节流...

Bucket: 用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。

Drive: 部署MinIO时设置的磁盘,MinIO中所有的对象数据都会存储到Drive。

Set: 一组Drive的集合,MinIO会自动根据Drive数量,将若干个Drive划分为多个Set(For example: {1...64} is divided into 4 sets each of size 16)。

四、MinIO安装与启动:

单机部署

(1)非纠删码模式部署:此模式下,对于每一份对象数据,minIO直接在data下面存储这份数据,不会建立副本,也不会启用纠删码机制。因此,这种模式无论是服务实例还是磁盘都是”单点“,无任何高可用保障,磁盘损坏就表示数据丢失。

(2)纠删码模式部署:此模式为MinIO server实例传入多个本地磁盘参数。一旦遇到多于一个磁盘参数,minio server 会自动启用纠删码模式。纠删码对磁盘的个数是有要求的,如不满足要求,实例启动失败。

单机版安装启动步骤:

第一步:下载MinIO软件,并添加执行权限chmod +x minio

第二步:修改账号、密码

export MINIO_ROOT_USER=minioadmin(自行设置) 

export MINIO_ROOT_PASSWORD=minioadmin(自行设置)

第三步:启动 /home/data是自己定义的文件路径,进入MinIO的安装目录执行./minio server /home/data

静默启动
nohup ./minio server /home/data >/home/data/minio.log 2>&1 &
静默启动 并 设置端口
nohup ./minio server --address 0.0.0.0:80 /home/data >/home/data/minio.log 2>&1 &

第四步:登录访问http://192.168.149.129:9000

第五步:创建桶并编辑策略,Bucket Policy策略管理

用于添加,删除,列出策略,获取有关策略的信息并为MinIO服务器上的用户设置策略。

五、Spring Boot整合MinIO

引入MinIO依赖

        <!--MinIO-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.3.3</version>
        </dependency>
application.yml配置文件

minio:
  endpoint: http://192.168.149.*:9000
  accessKey: minioadmin
  secretKey: minioadmin
  bucketName: myfirstbucket
配置类MinIOConfig

@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig{
    private String endpoint;
    private String accessKey;
    private String secretKey;
    private String bucketName;
 
    /**
     * 注入minio 客户端
     * @return MinioClient
     */
    @Bean
    public MinioClient minioClient(){
 
        return MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }
}

5.1.文件上传

    @Resource
    private MinioClient minioClient;
 
    @Value("${minio.bucketName}")
    private String bucketName;
 
     /**
     * 文件上传
     * @param file
     * @return ResponseData
     */
    @PostMapping("/upload")
    public ResponseData upload(@RequestParam(name = "file") MultipartFile[] file){
        if(file == null || file.length ==0){
            return ResponseData.error("上传文件不能为空");
        }
        //防御性编程,批量限制少于10个
        if(file.length > Constant.NumberInt.FILE_UPLOAD_LIMIT_NUM){
            return ResponseData.error("请上传少于" + file.length + "个文件");
        }
        try {
            List<String> urlList = new ArrayList<>(file.length);
            for (MultipartFile multipartFile : file){
                InputStream in = multipartFile.getInputStream();
//                minioClient.statObject(StatObjectArgs.builder().object(file.getOriginalFilename()).bucket(bucketName).build());
                minioClient.putObject(PutObjectArgs.builder().object(multipartFile.getOriginalFilename())
                        .bucket(bucketName)
                        .contentType(multipartFile.getContentType())
                        .stream(in, multipartFile.getSize(),-1).build());
                in.close();
                String str = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                        .bucket(bucketName)
                        .object(multipartFile.getOriginalFilename())
                        .method(Method.POST)
                        .build());
                String urlStr = StringUtils.substringBefore(str, "?");
                urlList.add(urlStr);
            }
            Map<String, Object> map = new HashMap<>();
            map.put("urlList", urlList);
            return ResponseData.success(map.get("urlList"));
        } catch (Exception e) {
            return ResponseData.error("上传失败:" + e.getMessage());
        }
    }

5.2.文件下载

    /**
     * 下载文件
     * @param filename
     * @param response
     */
    @GetMapping("/download/{filename}")
    public void download(@PathVariable String filename, HttpServletResponse response){
        InputStream in = null;
        try {
            //获取对象信息
            StatObjectResponse stat = minioClient.statObject(
                    StatObjectArgs.builder().bucket(bucketName).object(filename).build());
            response.setContentType(stat.contentType());
            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(filename, "utf-8"));
            //文件下载
            in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(filename).build());
            IOUtils.copy(in, response.getOutputStream());
        }catch (Exception e){
            e.getMessage();
        }finally {
            if(in != null){
                try {
                    in.close();
                }catch (IOException e){
                    e.getMessage();
                }
            }
        }
    }

5.3.文件删除

    /**
     * 删除文件
     * @param filename
     * @return ResponseData
     */
    @DeleteMapping("/delete/{filename}")
    public ResponseData delete(@PathVariable("fileName") String filename){
        try {
            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName)
                    .object(filename).build());
        }catch (Exception e){
            e.getMessage();
            return ResponseData.error("删除失败");
        }
        return ResponseData.success("删除成功");
    
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/weixin_39673648/article/details/122183059

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/554338
推荐阅读
相关标签
  

闽ICP备14008679号