springboot+vue实现Minio文件存储

安装minio

首先点击进入MINIO官网,进行一个minio服务器的下载

在这里插入图片描述

下载好了之后在本地磁盘找一个文件夹,把下载的exe放入文件夹,再新建一个文件夹准备存放数据和文件

在这里插入图片描述

在当前目录cmd进入控制台,输入代码

minio.exe server data

成功后会有访问路径以及账号密码
在这里插入图片描述

访问这个路径,输入刚刚控制台打印的账号密码就可以进入

http://127.0.0.1:9000
在这里插入图片描述

进入后创建buckets

在这里插入图片描述
在这里插入图片描述

后端

在官网找到依赖并导入

在这里插入图片描述

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

添加yml文件配置

# Minio配置 wyj配置
minio:endpoint: http://127.0.0.1:9000accessKey: minioadminsecretKey: minioadminbucketName: svt-ttt

MinIoClientConfig配置文件

这里bean文件只能有这一个,如果是多人团队项目开发记得在测试的时候协商好
@Value的注解导入是spring的原生注解

package com.wedu.config;import io.minio.MinioClient;
import lombok.Data;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;/** Minio的配置类* */
@Data
@Component
public class MinIoClientConfig {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.accessKey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;@Value("${minio.bucket-name}")private String bucketName;/*** 注入minio 客户端** @return*/@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}}

工具类MinIOUtil

工具类里有很多可使用的方法,这里只用到了uploadFile

package com.wedu.modules.tain.utils;import com.amazonaws.util.IOUtils;
import com.wedu.modules.equi.entity.ObjectItem;
import io.minio.*;
import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject;
import io.minio.messages.Item;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;@Component
public class MinIOUtil {@Autowiredprivate MinioClient minioClient;@Value("${minio.endpoint}")private String endpoint;@Value("${minio.access-key}")private String accessKey;@Value("${minio.secret-key}")private String secretKey;@Value("${minio.bucket-name}")private String bucketName;/*** 上传文件到指定的存储桶中** @param bucketName 存储桶名称* @param file 上传的文件* @param objectName 存储对象的名称* @param contentType 文件的内容类型* @return 文件上传的响应对象* @throws Exception 如果上传过程中发生异常*/@SneakyThrows(Exception.class)public ObjectWriteResponse uploadFile(String bucketName, MultipartFile file, String objectName, String contentType) {InputStream inputStream = file.getInputStream();return minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType).stream(inputStream, inputStream.available(), -1).build());}/*** description: 判断bucket是否存在,不存在则创建** @return: void*/public void existBucket(String name) {try {boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());if (!exists) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());}} catch (Exception e) {e.printStackTrace();}}/*** 创建存储bucket* @param bucketName 存储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* @param bucketName 存储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;}/*** description: 上传文件** @param multipartFile* @return: java.lang.String*/public List<String> upload(MultipartFile[] multipartFile) {List<String> names = new ArrayList<>(multipartFile.length);for (MultipartFile file : multipartFile) {String fileName = file.getOriginalFilename();String[] split = fileName.split("\\.");if (split.length > 1) {fileName = split[0] + "_" + System.currentTimeMillis() + "." + split[1];} else {fileName = fileName + System.currentTimeMillis();}InputStream in = null;try {in = file.getInputStream();minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(in, in.available(), -1).contentType(file.getContentType()).build());} catch (Exception e) {e.printStackTrace();} finally {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}names.add(fileName);}return names;}/*** description: 下载文件** @param fileName* @return: org.springframework.http.ResponseEntity<byte [ ]>*/public ResponseEntity<byte[]> download(String fileName) {ResponseEntity<byte[]> responseEntity = null;InputStream in = null;ByteArrayOutputStream out = null;try {in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());out = new ByteArrayOutputStream();IOUtils.copy(in, out);//封装返回值byte[] bytes = out.toByteArray();HttpHeaders headers = new HttpHeaders();try {headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}headers.setContentLength(bytes.length);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);headers.setAccessControlExposeHeaders(Arrays.asList("*"));responseEntity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);} catch (Exception e) {e.printStackTrace();} finally {try {if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}if (out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}}return responseEntity;}/*** 查看文件对象* @param bucketName 存储bucket名称* @return 存储bucket内文件对象信息*/public List<ObjectItem> listObjects(String bucketName) {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());List<ObjectItem> objectItems = new ArrayList<>();try {for (Result<Item> result : results) {Item item = result.get();ObjectItem objectItem = new ObjectItem();objectItem.setObjectName(item.objectName());objectItem.setSize(item.size());objectItems.add(objectItem);}} catch (Exception e) {e.printStackTrace();return null;}return objectItems;}/*** 批量删除文件对象* @param bucketName 存储bucket名称* @param objects 对象名称集合*/public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects) {List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());return results;}
}

controller调用uploadFile

    @Autowiredprivate MinIOUtil minIOUtil;@Autowiredprivate MinIoClientConfig minIoClientConfig;//minio@PostMapping("/minIoUpload")public R minIoUpload(@RequestParam("file") MultipartFile file) throws IOException {//文件名String fileName = file.getOriginalFilename();String newFileName = System.currentTimeMillis() + "." + StringUtils.substringAfterLast(fileName, ".");//类型String contentType = file.getContentType();minIOUtil.uploadFile(minIoClientConfig.getBucketName(), file, newFileName, contentType);return R.ok("上传成功");}

postman测试

测试成功
在这里插入图片描述
在这里插入图片描述

前端

主页面和springboot+vue实现oss文件存储一样,在弹窗的下拉框中添加一个2,访问路径变为自己的post的访问路径即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/498466.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2-溴叠氮,1-azido-2-bromoethane,可以与醇或酚反应生成相应的叠氮化物

2-溴叠氮&#xff0c;1-azido-2-bromoethane&#xff0c;1-Azido-2-bromo&#xff0c;可以与醇或酚反应生成相应的叠氮化物 您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;2-溴叠氮&#xff0c;1-azido-2-bromoethane&#xff0c;1-Azido-2-bromo&#xff0c;1 Az…

使用vue把一周的时间划分为可以选择多个阶段

提示&#xff1a;使用vue把一周的时间划分为可以选择多个阶段段&#xff08;亲测有效&#xff09; 一、直接复制以下代码 代码如下&#xff08;示例&#xff09;&#xff1a; <template><div class"byted-weektime" mousedown"dian" mousemove&qu…

第四十五回 病关索大闹翠屏山 拚命三火烧祝家店-Python函数接受任意关键字参数

官府得到上报&#xff0c;被杀死的僧人是报恩寺的裴如海&#xff0c;旁边的头陀是寺后面的人叫胡道。孔目说他们两个互相杀死&#xff0c;没有其他人什么事&#xff0c;这件事也就过去了。 杨雄听说了这件事&#xff0c;知道是石秀干的&#xff0c;找石秀为自己错怪他道歉。两…

请你画出一个微服务项目架构图

第一种 架构图 第二种 架构图

为您提供互联网一站式服务代采系统

1688跨境“寻源通”产品背景 11月19日, 1688跨境“寻源通”产品发布会在杭州举办。 1688跨境“寻源通”分别针对跨境ERP、跨境代采商、跨境超买和SaaS,为他们提供基于 AI 技术的搜索比价引擎,通过和官方合作把1688 的1亿官方源头货盘铺出去。 该计划的推出是为了解决跨境生意…

【Ansys Fluent Web 】全新用户界面支持访问大规模多GPU CFD仿真

基于Web的技术将释放云计算的强大功能&#xff0c;加速CFD仿真&#xff0c;从而减少对硬件资源的依赖。 主要亮点 ✔ 使用Ansys Fluent Web用户界面™&#xff08;UI&#xff09;&#xff0c;用户可通过任何设备与云端运行的仿真进行远程交互 ✔ 该界面通过利用多GPU和云计算功…

项目流程图

实现便利店自助付款项目 服务器&#xff1a; 1、并发服务器&#xff08;多进程、多线程、IO多路复用&#xff09; 2、SQL数据库的创建和使用&#xff08;增删改查&#xff09; 3、以模块化编写项目代码&#xff0c;按照不同模块编写.h/.c文件 客户端&#xff1a; 1、QT客户端界…

面试官:说一下Filter过滤器的执行顺序

背景说明 各位小伙伴大家好&#xff0c;我是全栈小白 相信各位小伙伴都用过Filter过滤器吧&#xff0c;在学习servlet的时候&#xff0c;Filter可是我们认证的好帮手&#xff0c;但是在学习了SpringBoot框架之后&#xff0c;Filter可能被大家遗忘了&#xff0c;相对Spring框架…

简析:网红老隋分享的temu蓝海项目能赚钱吗?

在如今这个信息化时代&#xff0c;网红老隋凭借其丰富的投资经验和市场洞察力&#xff0c;分享了许多具有潜力的蓝海项目。其中&#xff0c;temu项目备受关注&#xff0c;许多人好奇这个项目能否带来收益。下面&#xff0c;我将从市场前景、竞争状况、盈利模式等方面进行分析&a…

Edge 开启网页选择功能(Web Select)

微软禁用了Web Select功能 本着什么功能好用就禁用什么的原则, 微软又禁用了Web Select的功能, 相信这个功能用过的人都说好, 还有好多人不知道这个功能 开启方式, 快捷方式添加启动参数 --enable-featuresmsEdgeAreaSelect 如图 重启电脑或者杀掉进程才能生效 kill命令 kil…

BY组态功能清单

演示地址 &#xff1a;http://www.byzt.net:60/sm/ 官网地址&#xff1a;http://www.hcy-soft.com BY组态是一款非常优秀的纯前端的【web组态插件工具】&#xff0c;可无缝嵌入到vue项目&#xff0c;react项目等&#xff0c;由于是原生js开发&#xff0c;对于前端的集成没有框架…

SpringBoot案例(黑马学习笔记)

这个案例呢&#xff0c;就是Tlias智能学习辅助系统。 参考接口文档完成后端功能的开 发&#xff0c;然后结合前端工程进行联调测试即可。 完成后的成品效果展示&#xff1a; 准备工作 需求&环境搭建 需求说明 部门管理 部门管理功能开发包括&#xff1a; ● 查询部门列…