spring boot 集成MinIO上传图片

SpringBoot 集成MinIO SpringBoot 集成MinIO 引入jar包 <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.0.2</version> </dependency> 配置 minio: endpoint: 172.28.43.29 port: 9000 阅读详情

maven


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

yml

# MinIO配置
minio:
  url: http://192.168.0.184:9000
  accessKey: minioadmin
  secretKey: minioadmin
  bucketName: xrkc
  previewExpiry: 24

config

package com.xrkc.file.config;

import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Description:
 * @Auther: wangjiao
 * @Date: 2021-07-12 11:28
 */
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinIOConfig {
    /**
     * 服务地址
     */
    private String url;

    /**
     * 用户名
     */
    private String accessKey;

    /**
     * 密码
     */
    private String secretKey;

    /**
     * 存储桶名称
     */
    private String bucketName;

    /**
     * 预览到期时间(小时)
     */
    private Integer previewExpiry;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getAccessKey() {
        return accessKey;
    }

    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }

    public String getSecretKey() {
        return secretKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }

    public String getBucketName() {
        return bucketName;
    }

    public void setBucketName(String bucketName) {
        this.bucketName = bucketName;
    }

    public Integer getPreviewExpiry() {
        return previewExpiry;
    }

    public void setPreviewExpiry(Integer previewExpiry) {
        this.previewExpiry = previewExpiry;
    }

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

domain

package com.xrkc.file.domain;

import java.io.Serializable;

/**
 * @Description:
 * @Auther: wangjiao
 * @Date: 2021-07-12 16:41
 */
public class FileVo implements Serializable {
    private String fileName;
    private String previewUrl;
    /**
     * 所属模块(转换为"桶")
     */
    private String module;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getPreviewUrl() {
        return previewUrl;
    }

    public void setPreviewUrl(String previewUrl) {
        this.previewUrl = previewUrl;
    }

    public String getModule() {
        return module;
    }

    public void setModule(String module) {
        this.module = module;
    }
}

package com.xrkc.file.domain;

import org.springframework.web.multipart.MultipartFile;

import java.io.Serializable;

/**
 * @Description:
 * @Auther: wangjiao
 * @Date: 2021-07-12 16:41
 */
public class FileUploadBody implements Serializable {
    /**
     * 多文件
     */
    private MultipartFile[] files;
    /**
     * 所属模块(转换为"桶")
     */
    private String module;

    public MultipartFile[] getFiles() {
        return files;
    }

    public void setFiles(MultipartFile[] files) {
        this.files = files;
    }

    public String getModule() {
        return module;
    }

    public void setModule(String module) {
        this.module = module;
    }
}

controller

    @Autowired
    private IFileService fileService;

    @PostMapping("/upload")
    public JsonResult upload(FileUploadBody body) {
        List<FileVo> list;
        try {
            list = fileService.uploadFile(body);
        } catch (Exception e) {
            return JsonResult.error("上传失败,请刷新后重试");
        }
        return CollectionUtils.isEmpty(list)?JsonResult.error("要上传的文件不能为空"):JsonResult.success(list);
    }

service

package com.xrkc.file.service;

import com.xrkc.file.domain.FileUploadBody;
import com.xrkc.file.domain.FileVo;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * @Description:
 * @Auther: wangjiao
 * @Date: 2021-07-12 11:33
 */
public interface IFileService {
    List<FileVo> uploadFile(FileUploadBody body);

    String getPreviewUrl(String fileName, String bucketName);

    void downloadFile(HttpServletResponse response, String fileName, String bucketName);

    String delFile(String fileName, String bucketName);
}

package com.xrkc.file.service.impl;

import com.alibaba.nacos.common.utils.StringUtils;
import com.xrkc.file.domain.FileUploadBody;
import com.xrkc.file.config.MinIOConfig;
import com.xrkc.file.domain.FileVo;
import com.xrkc.file.service.IFileService;
import io.minio.*;
import io.minio.http.Method;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import org.apache.commons.io.IOUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @Description:
 * @Auther: wangjiao
 * @Date: 2021-07-12 11:34
 */
@Service
public class MinIOFileServiceImpl implements IFileService {
    private static final Logger log = LoggerFactory.getLogger(LocalFileServiceImpl.class);
    @Autowired
    private MinIOConfig minIOConfig;
    @Autowired
    private MinioClient minioClient;

    @Override
    public List<FileVo> uploadFile(FileUploadBody body){
        MultipartFile[] files=body.getFiles();
        if (Objects.nonNull(files) && files.length > 0) {
            String bucketName = StringUtils.isNotBlank(body.getModule()) ? body.getModule().replaceAll(",", "") : minIOConfig.getBucketName();
            List<FileVo> resultList = new ArrayList<>();
            for (MultipartFile file : files) {
                try {
                    if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
                        minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
                    }
                    String fileName = file.getOriginalFilename();
                    StringBuffer fileNameSB = new StringBuffer();
                    fileNameSB.append(System.currentTimeMillis()).append("_").append(bucketName).append("_").append(fileName.replaceAll(",", ""));
                    fileName = fileNameSB.toString();
                    PutObjectArgs args = PutObjectArgs.builder()
                            .bucket(bucketName)
                            .object(fileName)
                            .stream(file.getInputStream(), file.getSize(), -1)
                            .contentType(file.getContentType())
                            .build();
                    minioClient.putObject(args);
                    FileVo fileVo=new FileVo();
                    fileVo.setFileName(fileName);
                    fileVo.setModule(bucketName);
                    fileVo.setPreviewUrl(getPreviewUrl(fileName,bucketName));
                    resultList.add(fileVo);
                }catch (Exception e){
                    log.info("上传图片失败:",e.getMessage());
                }
            }
            return resultList;
        }
        return null;
    }

    @Override
    public String getPreviewUrl(String fileName, String bucketName) {
        if (StringUtils.isNotBlank(fileName)) {
            bucketName = StringUtils.isNotBlank(bucketName) ? bucketName : minIOConfig.getBucketName();
            try {
                minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());
                return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(fileName).expiry(minIOConfig.getPreviewExpiry(), TimeUnit.HOURS).build());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    public void downloadFile(HttpServletResponse response, String fileName, String bucketName) {
        if (StringUtils.isNotBlank(fileName)) {
            bucketName = StringUtils.isNotBlank(bucketName) ? bucketName : minIOConfig.getBucketName();
            try {
                StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());
                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
                response.setContentType(statObjectResponse.contentType());
                response.setCharacterEncoding("UTF-8");
                InputStream inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
                IOUtils.copy(inputStream, response.getOutputStream());
            } catch (Exception e) {
            }
        }
    }

    @Override
    public String delFile(String fileName, String bucketName) {
        if (StringUtils.isNotBlank(fileName)) {
            bucketName = StringUtils.isNotBlank(bucketName) ? bucketName : minIOConfig.getBucketName();
            try {
                minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
                return "success";
            }catch (Exception e) {
                return "删除文件失败,请刷新后重试";
                }
        }
        return "文件不能为空";
    }
}

安装对象存储MINIO并开启https 对象存储MINIO的安装使用步骤,附带java通过MINIO上传文件代码,以及开启https访问 阅读详情

相关推荐

基于MinIO的图片上传与缩略图生成实践指南

本文详细介绍了如何基于MinIO实现图片上传与缩略图生成的完整实践方案。从MinIO环境配置、Spring Boot集成到图片上传功能实现,再到缩略图生成与存储的最佳实践,提供了全面的技术指导。特别适合需要处理大量图片存储与处理的开发者参考,帮助构建高性能的图片管理系统。

weixin_30399821的博客 473

使用minio上传文件并返回地址及从minio上下载文件

结合minio文件上传下载

weixin_37822991的博客 9519

io.minio.errors.InvalidResponseException: Non-XML response from server. Response code: 400, Content-

springboot+ minio上传文件失败。

知识改变命运,ヾ(◍°∇°◍)ノ゙【求关注】 5431

简单的Springboot上传图片生成可访问的url

controller 层 @RestController @RequestMapping("/api/file") public class FileController { @Autowired private FileUploadService fileUploadService; @PostMapping("/upload") @ApiOper...

空❀城ლ 970

minio集成springboot实现上传文件详解

我这里下载的windows版本:解压里面有个minio.exe文件需要执行命令才能启动,里面包括文件所存储的磁盘位置:为了避免每次都会执行复杂的命令,这里我整理了启动脚本并将脚本保存到D:dev/minio中,您随意,只要同一个目录就可以。以上脚本中磁盘位置需要更换成自己的磁盘位置。接下来就是双击脚本启动成功后界面:用户名:minioadmin 密码:minioadmin启动成功后需要在里面设置自己的桶和两个密钥步入正题:是不是到这里你都会???别着急。

wuguanghui1的博客 1660

ROS2新手必看:5分钟搞定Gazebo机器人仿真环境搭建(含避坑指南)

本文为ROS2新手提供了在Gazebo中快速搭建机器人仿真环境的详细指南。内容涵盖ROS2与Gazebo的协同架构理解、基础环境配置、机器人模型构建、传感器集成以及环境创建,并包含实用的避坑指南和调试技巧,帮助开发者高效掌握物理仿真技术。

weixin_29100927的博客 430

SpringBoot集成Minio存储文件,开发图片上传等接口

我们平时的学习过程可能只是把文件存储在了本地,但是在实际开发中这肯定是不现实的,所以这时候我们就用到了Minio,MinIO 是一个开源的对象存储服务器。这意味着它允许你在互联网上存储大量数据,比如文件、图片、视频等,而不需要依赖传统的文件系统。MinIO 的特点在于它非常灵活、易于使用,同时也非常强大,可以在你的应用程序中方便地集成。像这样的存储工具还有oss以及七牛等等。这里着重介绍minio开发。

m0_73745224的博客 1090

实战解析:利用Wireshark解密QQ通信协议

本文提供了一份利用Wireshark工具分析QQ通信协议的实战指南。文章详细介绍了从环境准备、捕获数据包到解析协议层的完整流程,重点演示了如何识别QQ号码字段、观察加密数据特征以及区分不同通信类型(如文本、文件传输)。通过此实践,读者可以深入理解网络分层模型和现代应用加密通信机制,提升网络协议分析与安全诊断能力。

weixin_29210727的博客 407

minio使用

minio文件服务器

lz13419607299的博客 2万+

advanced installer 打包Flutter的Windows程序安装包(基本打包、开机自启、定时自动检测升级、包含卸载程序)

advanced installer 打包Flutter的Windows程序安装包(基本打包、开机自启、定时自动检测升级、包含卸载程序)

qq_45634989的博客 2878

Windows平台COLMAP实战:从零到三维重建的避坑指南

本文详细介绍了在Windows平台上使用COLMAP进行三维重建的完整流程,包括安装指南、数据准备技巧、图形界面操作及常见问题解决方案。特别针对Windows用户提供了CUDA版本与非CUDA版本的性能对比,帮助用户高效完成从照片到三维模型的重建过程。

weixin_29090677的博客 189

Spring Boot 集成 MinIO 对象存储服务器

MinIO 安装 wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x minio ./minio server /data 启动成功: [root@localhost minio]# ./minio server /data Endpoint: http://***:9000 http://***:9000 http://127.0.0.1:9000 RootUser: minioadmin Root

bfsz的博客 534

VS2019 C# MySQL 学生信息增删改查(一、增删)

VS2019 C# MySQL 学生信息增删改查 由于刚刚学习VS2019,入手的第一个例子是编写一个简单的增删改查。这里,我以学生信息为例,进行详细的过程描述以及代码实现。 一、 新建一个Windows窗体应用程序 1、创建新项目界面,如下图所示。 2、更改项目名称,当然不修改也可以。我这里的是“StudentInfoSystem”;项目存放位置路径根据自己需要进行更改;“将解决方案和项目放在同一目录中”前面的勾选框,选不选都可以;点击“创建”,如下图所示。 二、前期准备工作 1、将Form1属性中

青哥 1万+

MinIO实现简单文件上传【springboot】

在application.yml种添加minio配置,注意yml文件的格式。为了方便开发,将minio的操作封装为一个工具类。注意一定要注入minio的工具类。

m0_54230514的博客 1053

MSVS C# Matlab的混合编程系列2 - 构建一个复杂(含多个M文件)的动态库:

本节我们尝试将一个有很多函数和文件的Matlab算法文件集成到C#的项目里面。

山云的专栏 2068

【WRF-Urban】Registry.EM_COMMON文件概述及urban有关变量

Registry.EM_COMMON文件概述及urban有关变量

WW、forever的博客 1593

Minio篇:初识MinIO

下面介绍MinIO中的几个核心概念,这些概念在所有的对象存储服务中也都是通用的。对象是实际的数据单元,例如我们上传的一个图片。存储桶是用于组织对象的命名空间,类似于文件夹。每个存储桶可以包含多个对象。端点是MinIO服务器的网络地址,用于访问存储桶和对象,例如9000为MinIO的API的默认端口,前边配置的9001以为管理页面端口。是用于标识和验证访问者身份的唯一标识符,相当于用户名。是与关联的密码,用于验证访问者的身份。

viperd的博客 5535

大数据分析利器:Tableau实战教程从入门到精通

你有3家分店,每月收集1000条销售数据(日期、分店、口味、销售额、订单数);想用Excel分析“哪家分店最赚钱”,但要做透视表→改格式→画柱状图,耗时30分钟,还经常因为公式错误返工;想看看“草莓味奶茶的月度销量趋势”,得手动筛选数据、调整折线图轴范围,稍不注意就漏看关键节点;想把分析结果分享给合伙人,Excel表格太抽象,对方盯着数字问“你到底想告诉我什么?

AI架构师小马 1491

Springboot项目中minio的使用场景、使用过程(仅供参考)

在 ​​ 项目中,​​ 通常用于 ​​,类似于 AWS S3,可以存储图片、视频、文档等文件。以下是 ​​ 及 ​​。

weixin_52578852的博客 1178

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Minio(储桶bucket)上传和下载文件【Java】

minio切片上传:构建高效文件传输管道

fei飞来了 8520

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring Boot集成MinIO实战:文件存储从零到上线

本文详细介绍了如何在Spring Boot项目中集成MinIO对象存储服务,实现企业级文件存储方案。内容涵盖从Windows环境部署MinIO、Spring Boot后端集成配置,到核心工具类设计、大文件分片上传、图片处理、安全防护及生产环境监控等全流程实战技巧,帮助开发者快速构建稳定可靠的文件存储系统。

uu89012的博客 512

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

在云服务器上搭建 MinIO 图片存储服务器及 Spring Boot 整合实现图片上传下载

在自己的云服务器防火墙上开放9000和9001端口。:支持 Kubernetes 部署。:可以直接替换 AWS S3。使用docker命令拉取镜像。:单个二进制文件即可运行。:针对存储和检索优化。

Rancemy的博客 912

Typora自动上传图片,springboot集成Minio做私有化图床

在Typora自动上传图片 图床、私有化、免费

weixin_46951831的博客 390

minio的部署以及java代码整合

minio部署以及springboot整合minio

qq_42865470的博客 1214

使用 Spring Boot 集成七牛云实现图片/文件上传

本文介绍了在Spring Boot项目中集成七牛云对象存储实现文件上传的方法。首先讲解了七牛云账号注册、创建存储空间和获取密钥等准备工作,然后详细说明了集成步骤:添加SDK依赖、配置参数、封装上传工具类以及编写控制器接口。最后对比了七牛云、阿里云OSS和MinIO等存储方案的适用场景。该方法解决了传统本地存储的容量限制和访问速度问题,适合个人博客和小型项目使用。

2301_80165178的博客 546

抖音实战~分布式文件存储~SpringBoot集成MinIO

抖音实战~分布式文件存储~SpringBoot集成MinIO

Gblfy_Blog 658
上一篇: Linux创建用户只能操作某个目录
下一篇: easypoi基于springboot实现多sheet导出
夕颜以北
博客等级 码龄9年 30粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值