minio基本使用

本文详细介绍了如何通过Docker运行Minio服务器,配置端口映射和环境变量,以及在Java应用中使用SpringBoot集成Minio进行文件上传、预览、下载和管理。还讨论了如何配置URL访问和数据库存储文件前缀。
摘要由CSDN通过智能技术生成

直接docker润起来

docker run \
   -p 9000:9000 \
   -p 9001:9001 \
   --user $(id -u):$(id -g) \
   --name minio1 \
   -e "MINIO_ROOT_USER=ROOTUSER" \
   -e "MINIO_ROOT_PASSWORD=CHANGEME123" \
   -v ${HOME}/minio/data:/data \
   quay.io/minio/minio server /data --console-address ":9001"

9000是上传和下载的地址,就是提供给其他服务调用的地址。

9001是minio的管理页面的地址,在上面可以管理minio:

然后就是java调用:

配置:

server:
  port: 8001
minio:
  endpoint: http://192.168.126.134:9000 #Minio地址
  bucketName: backupstest #堆名
  accessKey: ROOTUSER #name
  secretKey: CHANGEME123 #密码

config文件:

package com.example.miniodome.comfig;

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;

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {

    private String endpoint;
    private String accessKey;
    private String secretKey;
    private String bucketName;

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
    }
}

package com.example.miniodome.util;

import com.example.miniodome.comfig.MinioConfig;
import io.micrometer.common.util.StringUtils;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import jakarta.annotation.Resource;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Component
@Slf4j
public class MinioUtil {
    @Autowired
    private MinioConfig prop;

    @Resource
    private MinioClient minioClient;

    /**
     * 查看存储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 {
            List<Bucket> buckets = minioClient.listBuckets();
            return buckets;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 文件上传
     *
     * @param file 文件
     * @return Boolean
     */
    public String upload(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        if (StringUtils.isBlank(originalFilename)) {
            throw new RuntimeException();
        }
        String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
        String objectName = LocalDate.now().toString() + fileName;
        try {
            PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(prop.getBucketName()).object(objectName)
                    .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
            //文件名称相同会覆盖
            minioClient.putObject(objectArgs);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return objectName;
    }

    public static void main(String[] args) {
        System.out.println(UUID.randomUUID());
    }

    /**
     * 预览图片
     *
     * @param fileName
     * @return
     */
    public String preview(String fileName) {
        // 查看文件地址
        GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(prop.getBucketName()).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(prop.getBucketName())
                .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(prop.getBucketName()).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(prop.getBucketName()).object(fileName).build());
        } catch (Exception e) {
            return false;
        }
        return true;
    }

}
package com.example.miniodome.util;

import lombok.Data;

/**
 * @program: springCloudAlibaba
 * @author: quxiao
 * @create: 2024-03-07 17:21
 **/
@Data
public class MyResult<T> {
    private static final String SUCCESS_CODE = "200";
    private static final String SUCCESS_MSG = "操作成功";
    private static final String FALL_CODE = "500";
    private static final String FALL_MSG = "操作失败";
    private String msgName;
    private String msgCode;
    private Boolean status;
    private T data;

    public static MyResult success(Object data) {
        MyResult result = new MyResult();
        result.setData(data);
        result.setStatus(true);
        result.setMsgCode(SUCCESS_CODE);
        result.setMsgName(SUCCESS_MSG);
        return result;
    }

    public static MyResult success() {
        MyResult result = new MyResult();
        result.setStatus(true);
        result.setMsgCode(SUCCESS_CODE);
        result.setMsgName(SUCCESS_MSG);
        return result;
    }

    public static MyResult fail() {
        MyResult result = new MyResult();
        result.setStatus(false);
        result.setMsgCode(FALL_CODE);
        result.setMsgName(FALL_MSG);
        return result;
    }

    public static MyResult fail(Object data) {
        MyResult result = new MyResult();
        result.setStatus(false);
        result.setMsgCode(FALL_CODE);
        result.setMsgName(FALL_MSG);
        result.setData(data);
        return result;
    }
}
package com.example.miniodome.controller;

import com.example.miniodome.comfig.MinioConfig;
import com.example.miniodome.util.MinioUtil;
import com.example.miniodome.util.MyResult;
import io.minio.messages.Bucket;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

//@Api(tags = "文件相关接口")
@Slf4j
@RestController
public class FileController {


    @Autowired
    private MinioUtil minioUtil;
    @Autowired
    private MinioConfig prop;

    // @ApiOperation(value = "查看存储bucket是否存在")
    @GetMapping("/bucketExists")
    public MyResult bucketExists(String bucketName) {
        return MyResult.success(minioUtil.bucketExists(bucketName));
    }

    // @ApiOperation(value = "创建存储bucket")
    @GetMapping("/makeBucket")
    public MyResult makeBucket(String bucketName) {
        minioUtil.makeBucket(bucketName);
        return MyResult.success();
    }

    // @ApiOperation(value = "删除存储bucket")
    @GetMapping("/removeBucket")
    public MyResult removeBucket(String bucketName) {
        minioUtil.removeBucket(bucketName);
        return MyResult.success();
    }

    // @ApiOperation(value = "获取全部bucket")
    @GetMapping("/getAllBuckets")
    public MyResult<List<Bucket>> getAllBuckets() {
        List<Bucket> allBuckets = minioUtil.getAllBuckets();
        return MyResult.success(allBuckets);
    }

    // @ApiOperation(value = "文件上传返回url")
    @PostMapping("/upload")
    public MyResult<String> upload(@RequestParam(value = "file") MultipartFile file) {
        String objectName = minioUtil.upload(file);
        if (null != objectName) {
            return MyResult.success(prop.getEndpoint() + "/" + prop.getBucketName() + "/" + objectName);
        }
        return MyResult.fail();
    }

    // @ApiOperation(value = "图片/视频预览")
    @GetMapping("/preview")
    public MyResult preview(@RequestParam("fileName") String fileName) {
        return MyResult.success(minioUtil.preview(fileName));
    }

    // @ApiOperation(value = "文件下载")
    @GetMapping("/download/{fileName}")
    public MyResult download(@PathVariable("fileName") String fileName, HttpServletResponse res) {
        minioUtil.download(fileName, res);
        return MyResult.success();
    }

    // @ApiOperation(value = "删除文件", notes = "根据url地址删除文件")
    @PostMapping("/delete")
    public MyResult remove(String url) {
        String objName = url.substring(url.lastIndexOf(prop.getBucketName() + "/") + prop.getBucketName().length() + 1);
        minioUtil.remove(objName);
        return MyResult.success();
    }

}

这里可以将提前生成的前缀存入数据库中,对应文件名。

然后调用下载的时候,就将文件名替换为真正的文件名,而不是用来标识准确文件的uuid前缀:

然后另一个就是,可以直接访问minio的资源,调用上传接口返回的url,但是需要在minio控制页面中配置:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java使用Minio可以通过引入Minio的依赖和配置相关参数来实现。首先,在pom.xml文件中添加Minio的依赖: ```xml <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.1.0</version> </dependency> ``` 接下来,配置Minio相关参数,包括endpoint、accessKey、secretKey、bucketName和folder等,例如: ```yaml minio: endpoint: http://127.0.0.1:9000 accessKey: minioadmin secretKey: minioadmin bucketName: icloud-test folder: cloudRecording/ ``` 然后,你可以编写工具类方法来操作Minio。例如,你可以设置文件的contentType类型目的来上传文件,也可以设置全局访问策略来控制桶的权限。如果需要取消公网访问,可以取消相关设置。具体的操作代码可以根据你的需求来编写。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JavaMinIo文件系统工具类](https://blog.csdn.net/weixin_45285213/article/details/128329939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Minio基本使用(Java)](https://blog.csdn.net/h4241778/article/details/125853546)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值