分布式文件服务器FastDfs 和 MinIO

阅读: 评论:0

分布式文件服务器FastDfs 和 MinIO

分布式文件服务器FastDfs 和 MinIO

技术选型FastDfs 和 MinIO

.html

简介

MinIO 是一个基于Apache License
v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

Minio 相对于目前业务程度更加友好和轻量。
公司之前使用的集群服务版本为8.2.0(考虑到发布时间和使用率就改成了7.1.0来保证稳定性) 所以用版本8 参考意义不大

Minio 版本查看以及最新版本API 官网非常不友好(希望官网多多更新)。从版本7到8不管是docker容器还是界面以及API都有大的调整。这也是一个好消息 说明Minio 使用率越来越高了。

这里讲一下版本7的API实现

  1. 官网下载进行服务部署(如果有运维,自己可以在Windows进行部署测试 非常简单方便)
  1. MinioTemplate
@Component
@RequiredArgsConstructor
@Data
@Service
public class MinioTemplate implements InitializingBean {@Resourceprivate FileConfig fileConfig;private MinioClient minioClient;/*** 上传文件** @param bucketName bucket名称* @param objectName 文件名称* @param stream     文件流* @throws Exception .html#putObject*/@SneakyThrowspublic void putObject(String bucketName, String objectName, InputStream stream, int length) {if (StringUtils.isEmpty(bucketName)) {bucketName = BucketName();}PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName).bucket(bucketName).contentType("application/octet-stream").stream(stream, stream.available(), length).build();minioClient.putObject(objectArgs);}/*** 获取文件外链** @param bucketName bucket名称* @param objectName 文件名称* @param expires    过期时间 <=7* @return url*/@SneakyThrowspublic String getObjectURL(String bucketName, String objectName, Integer expires) {if (StringUtils.isEmpty(bucketName)) {bucketName = BucketName();}return minioClient.presignedGetObject(bucketName, objectName, expires);}/*** 获取文件路径** @param bucketName* @param fileName* @return*/@SneakyThrowspublic String getObjectURL(String bucketName, String fileName) {if (StringUtils.isEmpty(bucketName)) {bucketName = BucketName();}ObjectUrl(bucketName, fileName);}/*** 获取文件** @param bucketName* @param objectName* @return*/@SneakyThrowspublic ObjectStat statObject(String bucketName, String objectName) {if (StringUtils.isEmpty(bucketName)) {bucketName = BucketName();}return minioClient.statObject(bucketName, objectName);}/*** 获取文件** @param bucketName bucket名称* @param objectName 文件名称* @return 二进制流*/@SneakyThrowspublic InputStream getObject(String bucketName, String objectName) {if (StringUtils.isEmpty(bucketName)) {bucketName = BucketName();}GetObjectArgs objectArgs = GetObjectArgs.builder().object(objectName).bucket(bucketName).build();Object(objectArgs);}/*** 删除文件** @param bucketName bucket名称* @param objectName 文件名称* @throws Exception .html#removeObject*/public void removeObject(String bucketName, String objectName) throws Exception {if (StringUtils.isEmpty(bucketName)) {bucketName = BucketName();}RemoveObjectArgs objectArgs = RemoveObjectArgs.builder().object(objectName).bucket(bucketName).build();veObject(objectArgs);}/*** 检查存储桶是否存在** @param bucketName 存储桶名称* @return*/public boolean bucketExists(String bucketName) {if (StringUtils.isEmpty(bucketName)) {bucketName = BucketName();}boolean flag = false;try {flag = minioClient.bucketExists(bucketName);if (flag) {return true;}} catch (Exception e) {e.printStackTrace();return false;}return false;}/*** 创建存储桶** @param bucketName 存储桶名称*/public boolean makeBucket(String bucketName) {if (StringUtils.isEmpty(bucketName)) {bucketName = BucketName();}try {boolean flag = bucketExists(bucketName);//存储桶不存在则创建存储桶if (!flag) {minioClient.makeBucket(bucketName);}return true;} catch (Exception e) {e.printStackTrace();return false;}}public String getMemoryAddress() {String memoryAddress = MemoryAddress();return memoryAddress;}@Overridepublic void afterPropertiesSet() throws Exception {Assert.Endpoint(), "Minio 地址为空");Assert.AccessKey(), "Minio accessKey为空");Assert.SecretKey(), "Minio secretKey为空");this.minioClient = MinioClient.builder().Endpoint()).AccessKey(), SecretKey()).build();}/*** 生成唯一替换图片不覆盖情况** @return*/public String randomUUID() {String uuid = UUID.randomUUID().toString().replaceAll("--", "");return uuid;}
  1. FileConfig
@Component
@Data
@ConfigurationProperties(prefix = "xx.minio")
public class FileConfig {/*** minio地址+端口号*/private String endpoint;/*** minio-bucket目前配置指定(后续拓展可以改成动态)*/private String bucketName;/*** accessKey*/private String accessKey;/*** secretKey*/private String secretKey;/*** 默认 minio* 存储地址(minio/table)*///这个根据自己业务private String memoryAddress;}
  1. MinioController
@Api(tags = "MinIO对象存储管理", value = "MinIO对象存储管理")
@RestController
@RequestMapping("minio")
public class MinioController {@Autowiredprivate MinioTemplate minioTemplate;@ApiOperation("文件上传")@PostMapping(value = "/upload")public Result upload(@RequestParam("file") MultipartFile file) throws Exception {if (file.isEmpty()) {throw new BusinessException("上传文件不能为空");} else {// 得到文件流final InputStream is = InputStream();final String fileName = OriginalFilename();// 把文件放到minio的boots桶里面minioTemplate.putObject("", fileName, is, -1);String objectUrl = ObjectURL("", fileName);// 关闭输入流is.close();Success(objectUrl);}}/*** 下载文件*/@ApiOperation(value = "下载文件")@GetMapping(value = "/download")@SneakyThrows(Exception.class)public void download(@RequestParam("fileName") String fileName, HttpServletResponse response) {ObjectStat stat = minioTemplate.statObject("", fileName);response.tType());response.setHeader("Content-Disposition", "attachment;filename=" + de(fileName, "UTF-8"));InputStream in = Object("", fileName);py(in, OutputStream());in.close();}/*** 删除文件*/@ApiOperation(value = "删除文件")@GetMapping(value = "/delete")@SneakyThrows(Exception.class)public Result delete(@RequestParam("fileName") String fileName) {veObject("", fileName);Success();}/*** 查看文件*/@ApiOperation(value = "查看文件")@GetMapping(value = "/look")@SneakyThrows(Exception.class)public Result lookFile(@RequestParam("fileName") String fileName) {String objectUrl = ObjectURL("", fileName);Success(objectUrl);}}

下载文件,如果需要可以修改返回的原文件名称给前端

下载API 返回原文件名称

@Override
@SneakyThrows(Exception.class)
public void download(String fileId, HttpServletResponse response) {CptAttachManage cptAttachManage = cptAttachManageMapper.selectById(fileId);String fileName = FileName();ObjectStat stat = minioTemplate.statObject("", fileName);response.tType());if (StringUtils.OrigFileName())) {return;}response.setHeader("Content-Disposition", "attachment;filename=" + OrigFileName(), "UTF-8"));InputStream in = Object("", fileName);py(in, OutputStream());in.close();
}
#MinIO文件服务对象存储相关配置minio:endpoint: 127.0.0.1:29200 #MinIO服务所在地址bucketName: cloud-dev #存储桶名称(可改成动态)accessKey: minio  #访问的key(需加密)secretKey: password  #访问的秘钥(需加密)memoryAddress: minio

本文发布于:2024-02-02 01:59:08,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170681400640680.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23