1 下载

minio官方文档
我选择的是docker部署

docker pull minio/minio
docker run \-p 9000:9000 \-p 9001:9001 \--name minio1 \-v ~/minio/data:/data \-e "MINIO_ROOT_USER=username" \-e "MINIO_ROOT_PASSWORD=password" \-d \quay.io/minio/minio server /data --console-address ":9001"

访问http://localhost:9001/ 进入控制台界面 ( 如果是云服务器记得打开9001端口)

2 上传文件到minio

创建名为hms的桶

然后上传一个图片

设置访问规则:

添加只读属性,前缀为 “*”,这样就可以浏览器访问了

访问:http://服务器ip:9000/桶名/文件名

2 SpringBoot整合

2.1 依赖,主启动

最开始用的8.3.7, 和我的jar包冲突了,又换成8.2.1

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

2.2 配置文件

server:port: 9201
spring:application:name: filedatasource:username: rootpassword: 18170021url: jdbc:mysql://localhost:3306/db_hms_file?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Drivercloud:nacos:server-addr: localhost:8848# 配置文件大小限制servlet:multipart:max-file-size: 100MBmax-request-size: 100MB
minio:# minio配置是自定义的配置,注意:一定加http://endpoint: http://localhost:9000   accessKey: rootsecretKey: root18170021bucketName: hms
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.3 Minio客户端配置类

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioClientConfig {private String endpoint;private String accessKey;private String secretKey;@Beanpublic MinioClient minioClient()  {MinioClient minioClient = MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();return minioClient;}
}

2.4 工具类

不要被吓跑哦,我只用到其中的上传下载删除三个方法,不过以后可能会用到就都copy过来了

@Component
public class MinioUtil {@Autowiredprivate MinioClient minioClient;/*** 查看存储bucket是否存在* @return boolean*/public Boolean bucketExists(String bucketName) {Boolean found;try {found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());} catch (Exception e) {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 {return minioClient.listBuckets();} catch (Exception e) {e.printStackTrace();}return null;}/*** 文件上传* @param file 文件* @return Boolean*/public Boolean upload(String bucketName, String fileName, MultipartFile file, InputStream inputStream) {try {PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(inputStream,file.getSize(),-1).contentType(file.getContentType()).build();//文件名称相同会覆盖minioClient.putObject(objectArgs);} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 预览图片* @param fileName* @return*/public String preview(String fileName,String bucketName){// 查看文件地址GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder().bucket(bucketName).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,String bucketName, HttpServletResponse res) {GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName).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(String bucketName) {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).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,String bucketName){try {minioClient.removeObject( RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());}catch (Exception e){return false;}return true;}/*** 批量删除文件对象(没测试)* @param objects 对象名称集合*/public Iterable<Result<DeleteError>> removeObjects(List<String> objects, String bucketName) {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;}
}

2.5 Controller

@RestController
@RequestMapping("file")
public class FileController {private static final Logger log = LogManager.getLogger();@Autowiredprivate FileItemServiceImpl fileItemService;@PostMapping("upload")public Result upload(@Valid @NotNull @RequestParam(value = "file") MultipartFile file, @Valid @NotNull Integer type) {Result result;try {FileItemVO fileItemVO = fileItemService.uploadFile(file, type);result = Result.success("文件上传成功!", fileItemVO);} catch (BcException e) {result = Result.error(e.getCode(), e.getMessage());log.error(e.getMessage());}return result;}@GetMapping("download")public void download(HttpServletResponse response,@Valid @RequestParam @NotBlank(message = "fileId不能为空") Integer fileId) {try {fileItemService.downloadFile(fileId, response);} catch (BcException e) {log.error(e.getMessage());}}@GetMapping("delete")public Result<String> delete(@Valid @RequestParam @NotBlank(message = "fileId不能为空") Long fileId) {Result result;try {fileItemService.deleteFile(fileId);result = Result.success("删除附件成功!", fileId);} catch (BcException e) {result = Result.error(e.getCode(), e.getMessage());}return result;}
}

2.6 Service

service

public interface FileItemService {/*** 上传文件到服务器中* @param file* @param type* @return*/FileItemVO uploadFile(MultipartFile file, Integer type);/*** 下载文件* @param fileId* @param response*/void downloadFile(Integer fileId, HttpServletResponse response);/*** 删除文件* @param fileId*/void deleteFile(Long fileId);
}

serviceImpl

@Service
public class FileItemServiceImpl implements FileItemService {@Resourceprivate MinioUtil minioUtil;@Value("${minio.bucketName}")private String bucketName;@Value("${minio.endpoint}")private String endpoint;@Autowiredprivate FileMapper fileMapper;private String[] fileFolders = new String[]{"doctorPhotos/", "report", "otherImage/"};@Override@Transactional(rollbackFor = Exception.class)public FileItemVO uploadFile(MultipartFile file, Integer type) {FileItemVO fileItemVO = null;try {String fileName = file.getOriginalFilename();String ext = fileName.substring(fileName.lastIndexOf("."));String newFileName = fileFolders[type] + UUID.randomUUID().toString().replaceAll("-", "") + ext;InputStream inputStream = file.getInputStream();Boolean flag = minioUtil.upload(bucketName, newFileName,file, inputStream);if(!flag) {throw new BcException(ErrorCode.file_upload_fail.getCode(), "文件上传失败");}String url = getUrl(newFileName);fileItemVO = FileItemVO.builder().newFileName(newFileName).fileName(fileName).ext(ext).url(url).build();FileEntity fileEntity = new FileEntity();BeanUtils.copyProperties(fileItemVO, fileEntity);fileEntity.setType(type);fileMapper.insert(fileEntity);fileItemVO.setFileId(fileEntity.getId());} catch (Exception e) {throw new BcException(ErrorCode.file_upload_fail.getCode(), "文件上传失败");}return fileItemVO;}@Transactional(readOnly = true)@Overridepublic void downloadFile(Integer fileId, HttpServletResponse response) {FileEntity fileEntity = fileMapper.selectById(fileId);if(ObjectUtils.isEmpty(fileEntity)) {throw new BcException(ErrorCode.file_not_exit.getCode(), "文件不存在");}try {minioUtil.download(fileEntity.getNewFileName(), bucketName, response);} catch (Exception e) {throw new BcException(ErrorCode.download_id_exception.getCode(), "文件下载失败");}}@Transactional(rollbackFor = Exception.class)@Overridepublic void deleteFile(Long fileId) {FileEntity fileEntity = fileMapper.selectById(fileId);if(ObjectUtils.isEmpty(fileEntity)) {throw new BcException(ErrorCode.file_not_exit.getCode(), "文件不存在");}try {minioUtil.remove(fileEntity.getNewFileName(), bucketName);fileMapper.deleteById(fileId);} catch (Exception e) {throw new BcException(ErrorCode.download_id_exception.getCode(), "文件删除失败");}}private String getUrl(String newFileName) {return endpoint+ "/"+ bucketName+ "/"+ newFileName;}
}

2.7 实体和数据库

FileItemVO (上传文件后响应结果)

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FileItemVO {/*** 文件id*/private Long fileId;/*** 文件可访问URL*/private String url;/*** 文件的拓展名*/private String ext;/*** 上传的源文件的文件名,带有拓展*/private String fileName;/*** 上传后的文件名*/private String newFileName;}

file表

DROP TABLE IF EXISTS `file`;
CREATE TABLE `file`  (`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id',`file_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户上传文件的原始名称,带有文件拓展',`ext` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件拓展名',`type` int(0) NOT NULL COMMENT '文件类型:1医生照片 2其他图片 3体检报告',`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'url',`new_file_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'minio里面的文件名',`created_time` datetime(0) NOT NULL COMMENT '创建时间',`modified_time` datetime(0) NOT NULL COMMENT '修改时间',`state` int(0) NOT NULL DEFAULT 0 COMMENT '状态',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

2.8 参考链接

参考链接:
https://www.cnblogs.com/shanheyongmu/p/15581961.html

搭建文件服务器 MinIO相关推荐

  1. 搭建文件服务器MinIO,快速上手使用

    搭建文件服务器MinIO 官网 简单介绍 下载 搭建环境运行 默认配置.修改配置信息 正常访问 官网 minio 官方网址:https://min.io/         minio 中文镜像网站:h ...

  2. 使用minio搭建文件服务器,MinIO文件服务器构建

    Docker 容器安装MinIO文件服务器 稳定版 docker pull minio/minio 注意:启动,此命令在容器关闭时数据自动消失. docker run -p 9000:9000 min ...

  3. 写给大忙人看的 - 搭建文件服务器 MinIO(1)

    一.简介 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容 ...

  4. SpringBoot 搭建基于 minio 的高性能存储服务

    欢迎关注方志朋的博客,回复"666"获面试宝典 什么是minio 引用官网: MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储.它与Amazon S3 ...

  5. linux中使用Vsftpd+nginx 搭建文件服务器

    目录标题 搭建文件服务器 1.安装 vsftpd 2.给文件服务器添加一个用户 3.设置开机自启动 vsftpd常用操作命令 安装Nginx 搭建文件服务器 1.安装 vsftpd yum -y in ...

  6. vps怎么做文件服务器,vps搭建文件服务器

    vps搭建文件服务器 内容精选 换一换 方法一:在VSCode上选择"文件 > 首选项 > 设置",再选择"工作区",并在输入框搜索"ku ...

  7. Centos 7 x64 搭建文件服务器HFS

    Centos 7 x64 搭建文件服务器HFS 提供文件服务器的方法有很多,tomcat自己就带文件服务器的功能,但是我自己上传部分一直配置失败..百度以后Windows有可以直接用的文件服务器HFS ...

  8. 文件服务器搭建 xp,xp搭建文件服务器

    xp搭建文件服务器 内容精选 换一换 本节操作介绍华为云上云服务器的跨账号跨区域迁移,建议采用镜像迁移方式.服务器迁移的常见场景与常用的迁移方式请参考迁移的背景知识.跨账号跨区域迁移的方法请参考方案介 ...

  9. linux apache文件浏览器,在linux下使用Apache搭建文件服务器

    一.关于文件服务器 ​在一个项目中,如果想把公共软件或者资料共享给项目组成员,可以搭建一个简易的文件服务器来实现,只要是在局域网内的成员都可以通过浏览器或者wget命令来下载和访问资料.可以达到信息共 ...

最新文章

  1. python单词翻译-完成自动查找翻译单词的python源代码
  2. 今日浅谈循环 for与while
  3. CodeForces - 456D A Lot of Games(字典树+博弈)
  4. mysql 分组查出来横向展示_MySQL汇总分析(group by)
  5. 【bzoj3576】 Hnoi2014—江南乐
  6. MySQL启动异常Starting MySQL.The server quit without .
  7. win10远程计算机或设备将不接收连接?
  8. CAD建模软件BricsCAD 22.2.03 for Mac
  9. Redis----windows下配置和运行
  10. mysql on 子句_ON子句中的MySQL未知列
  11. list排序sort降序_list.sort和高阶函数sorted
  12. SQL四种方法实现行列转换超详细
  13. 计算机中¥符号按哪个键,人民币键盘符号怎么打 电脑怎么打人民币符号
  14. 电脑知识 - bin文件夹是什么
  15. 【华人学者风采】林达华 香港中文大学
  16. 【阶段二】Python数据分析Pandas工具使用07篇:探索性数据分析:数据的描述:数据的集中趋势
  17. http服务(nginx、apache)停用不安全的SSL协议、TLS1.0和TLS1.1协议/启用TLS1.3
  18. Android Button控件字母大小写显示问题
  19. mac checkra1n越狱14.0-14.8
  20. Go语言圣经 - 第11章 测试 - 11.1 go test 11.2 测试函数

热门文章

  1. C# byte数组转string,string转byte数组
  2. svn上传文件时出现 “xxx is already under version control” 报错
  3. MySQL与MariaDB学习笔记
  4. 致自己:HTML学习笔记二
  5. SOHO 为自己的人生买单
  6. fulltext mysql_mysql – FULLTEXT和FULLTEXT KEY / INDEX有什么区别?
  7. 了解 Windows Azure 存储计费 – 带宽、事务和容量
  8. python自动填写小程序表单_python小程序实现刷票功能详解
  9. 很火的AI换脸怎么做的?方法其实非常简单
  10. 致敬科比,JS 手写贪吃蛇