Springboot整合Minio实现文件上传和下载

简介: Minio是一个灵活、高性能、开源的对象存储解决方案,适用于各种存储需求,并可以与云计算、容器化、大数据和应用程序集成。它为用户提供了自主控制和可扩展性,使其成为一个强大的存储解决方案。

1. Minio


Minio是一个灵活、高性能、开源的对象存储解决方案,适用于各种存储需求,并可以与云计算、容器化、大数据和应用程序集成。它为用户提供了自主控制和可扩展性,使其成为一个强大的存储解决方案。


1.1 Minio下载


安装 MinIO 服务器,从以下 URL 下载 MinIO 可执行文件:


https://dl.min.io/server/minio/release/windows-amd64/minio.exe


使用此命令启动下载文件夹中的本地 MinIO 实例。


.\minio.exe server C:\minio --console-address :9090


将其输出输出到系统控制台,类似于以下内容:

API: http://192.0.2.10:9000  http://127.0.0.1:9000
RootUser: minioadmin
RootPass: minioadmin
Console: http://192.0.2.10:9090 http://127.0.0.1:9090
RootUser: minioadmin
RootPass: minioadmin
Command-line: https://min.io/docs/minio/linux/reference/minio-mc.html
   $ mc alias set myminio http://192.0.2.10:9000 minioadmin minioadmin
Documentation: https://min.io/docs/minio/linux/index.html
WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables.


该过程绑定到当前的 PowerShell 或命令提示符窗口。 关闭窗口将停止服务器并结束进程。


2. Springboot和Minio实现文件存储


在pom.xml文件中,添加MinIO的依赖项:


 

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

 

在application.properties文件中,配置MinIO的连接信息:


minio:
  endpoint: http://127.0.0.1:9000
  accessKey: admin1234
  secretKey: admin1234
  bucketName: bucket1


在Spring Boot的配置类中,创建MinIO的客户端实例:

@Data
@Configuration
public class MinioConfig {
    /**
     * 访问地址
     */
    @Value("${minio.endpoint}")
    private String endpoint;
    /**
     * accessKey类似于用户ID,用于唯一标识你的账户
     */
    @Value("${minio.accessKey}")
    private String accessKey;
    /**
     * secretKey是你账户的密码
     */
    @Value("${minio.secretKey}")
    private String secretKey;
    /**
     * 默认存储桶
     */
    @Value("${minio.bucketName}")
    private String bucketName;
    @Bean
    public MinioClient minioClient() {
        MinioClient minioClient = MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
        return minioClient;
    }
}


上传和下载文件:


@Slf4j
@RestController
@RequestMapping("/oss")
public class OSSController {
    @Autowired
    private MinioConfig minioProperties;
    @Autowired
    private MinioClient minioClient;
    /**
     * 文件上传
     *
     * @param file
     */
    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        if (file == null || file.getSize() == 0) {
            log.error("==> 上传文件异常:文件大小为空 ...");
            throw new RuntimeException("文件大小不能为空");
        }
        boolean b = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioProperties.getBucketName()).build());
        if(!b){
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucketName()).build());
        }
        String originalFileName = file.getOriginalFilename();
        String contentType = file.getContentType();
        String key = UUID.randomUUID().toString().replace("-", "");
        String suffix = originalFileName.substring(originalFileName.lastIndexOf("."));
        String objectName = String.format("%s%s", key, suffix);
        log.info("==> 开始上传文件至 Minio, ObjectName: {}", objectName);
        InputStream inputStream = file.getInputStream();
        minioClient.putObject(PutObjectArgs.builder()
                .bucket(minioProperties.getBucketName())
                .object(objectName)
                .stream(inputStream, file.getSize(), -1)
                .contentType(contentType)
                .build());
        String url = String.format("%s/%s/%s", minioProperties.getEndpoint(), minioProperties.getBucketName(), objectName);
        log.info("==> 上传文件至 Minio 成功,访问路径: {}", url);
        inputStream.close();
        return url;
    }
    @GetMapping("/download")
    public void download(@RequestParam("filename") String filename, HttpServletResponse response) {
        try(InputStream inputStream = minioClient.getObject(GetObjectArgs.builder()
                .bucket(minioProperties.getBucketName())
                .object(filename)
                .build())) {
            ServletOutputStream outputStream = response.getOutputStream();
            response.setContentType("application/octet-stream");
            response.setCharacterEncoding("utf-8");
            response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
            byte[] bytes = new byte[1024];
            int len;
            while ((len = inputStream.read(bytes)) > 0) {
                outputStream.write(bytes, 0, len);
            }
            outputStream.close();
        } catch (Exception e) {
            log.error("file download from minio exception, file name: {}", filename,  e);
        }
    }
}


注意:桶权限设置Access Policy为public,否则无法访问图片

相关文章
|
23天前
|
Java 数据库连接 mybatis
springboot访问jsp页面变成直接下载?
springboot访问jsp页面变成直接下载?
24 0
|
4月前
|
存储 前端开发 Java
spring boot 实现Minio分片上传
spring boot 实现Minio分片上传
212 1
|
2月前
|
JavaScript 前端开发 Java
springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类)
springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类)
341 0
|
3月前
|
存储 Java 对象存储
springboot配置阿里云OSS存储实现文件上传下载功能
【1月更文挑战第1天】springboot配置阿里云OSS存储实现文件上传下载功能
485 2
|
4月前
|
前端开发 Java Apache
Spring Boot文件上传与下载讲解与实战(超详细 附源码)
Spring Boot文件上传与下载讲解与实战(超详细 附源码)
316 0
|
3月前
|
JavaScript 小程序 Java
基于Java+SpringBoot+Vue的摄影素材分享网站的设计与实现(亮点:活动报名、点赞评论、图片下载、视频下载、在线观看)
基于Java+SpringBoot+Vue的摄影素材分享网站的设计与实现(亮点:活动报名、点赞评论、图片下载、视频下载、在线观看)
47 0
|
4月前
|
Java Linux 开发工具
MinIO【部署 01】MinIO安装及SpringBoot集成简单测试
MinIO【部署 01】MinIO安装及SpringBoot集成简单测试
112 0
|
4月前
|
JavaScript 前端开发 Java
Spring Boot中Node.js的下载与Vue CLI在IDEA中的部署及使用(图文解释 简单易懂)
Spring Boot中Node.js的下载与Vue CLI在IDEA中的部署及使用(图文解释 简单易懂)
44 0
|
4月前
|
IDE Java 开发工具
【CSDN 云IDE】中实现Spring Boot文件的上传与下载
【CSDN 云IDE】中实现Spring Boot文件的上传与下载
42 0
【CSDN 云IDE】中实现Spring Boot文件的上传与下载
|
4天前
|
Java Linux
Springboot 解决linux服务器下获取不到项目Resources下资源
Springboot 解决linux服务器下获取不到项目Resources下资源