当前位置: 首页 > news >正文

spring boot整合Minio

MinIO

安装MinIo

# 先创建minio 文件存放的位置
mkdir -p /opt/docker/minio/data# 启动并指定端口
docker run \-p 9000:9000 \-p 5001:5001 \--name minio \-v /opt/docker/minio/data:/data \-e "MINIO_ROOT_USER=minioadmin" \-e "MINIO_ROOT_PASSWORD=minioadmin" \-d minio/minio server /data --console-address ":5001"# 设置为和 docker 绑定启动,docker 启动则 minio 就启动
docker update --restart=always

导入依赖

<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.4.0</version>
</dependency>

application.yml 配置信息

minio:endpoint: http://192.168.218.131/:9000 #Minio服务所在地址bucketName: tulaoda #存储桶名称accessKey: minioadmin #访问的keysecretKey: minioadmin #访问的秘钥

MinioConfig.class配置类

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

minio工具类

@Component
@Slf4j
public class MinioUtil {@Autowiredprivate MinioConfig prop;@Resourceprivate MinioClient minioClient;@Autowiredprivate CodeService codeService;/*** 查看存储bucket是否存在* @return boolean*/public Boolean bucketExists(String bucketName) {Boolean found;try {found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());} catch (Exception e) {e.printStackTrace();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 {List<Bucket> buckets = minioClient.listBuckets();return buckets;} catch (Exception e) {e.printStackTrace();}return null;}/*** 文件上传** @param file 文件* @return Boolean*/public String upload(MultipartFile file) {String originalFilename = file.getOriginalFilename();if (StringUtils.isBlank(originalFilename)){throw new RuntimeException();}String fileName = UuidUtils.generateUuid() + originalFilename.substring(originalFilename.lastIndexOf("."));String objectName = CommUtils.getNowDateLongStr("yyyy-MM/dd") + "/" + fileName;try {PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(prop.getBucketName()).object(objectName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();//文件名称相同会覆盖minioClient.putObject(objectArgs);} catch (Exception e) {e.printStackTrace();return null;}return objectName;}/*** 预览图片* @param fileName* @return*/public String preview(String fileName){// 查看文件地址GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(prop.getBucketName()).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, HttpServletResponse res) {GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(prop.getBucketName()).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() {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(prop.getBucketName()).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){try {minioClient.removeObject( RemoveObjectArgs.builder().bucket(prop.getBucketName()).object(fileName).build());}catch (Exception e){return false;}return true;}}

文件处理接口

@Api(tags = "文件相关接口")
@Slf4j
@RestController
@RequestMapping(value = "/product/file")
public class FileController {@Autowiredprivate MinioUtil minioUtil;@Autowiredprivate MinioConfig prop;@ApiOperation(value = "查看存储bucket是否存在")@GetMapping("/bucketExists")public R bucketExists(@RequestParam("bucketName") String bucketName) {return R.ok().put("bucketName",minioUtil.bucketExists(bucketName));}@ApiOperation(value = "创建存储bucket")@GetMapping("/makeBucket")public R makeBucket(String bucketName) {return R.ok().put("bucketName",minioUtil.makeBucket(bucketName));}@ApiOperation(value = "删除存储bucket")@GetMapping("/removeBucket")public R removeBucket(String bucketName) {return R.ok().put("bucketName",minioUtil.removeBucket(bucketName));}@ApiOperation(value = "获取全部bucket")@GetMapping("/getAllBuckets")public R getAllBuckets() {List<Bucket> allBuckets = minioUtil.getAllBuckets();return R.ok().put("allBuckets",allBuckets);}@ApiOperation(value = "文件上传返回url")@PostMapping("/upload")public R upload(@RequestParam("file") MultipartFile file) {String objectName = minioUtil.upload(file);if (null != objectName) {return R.ok().put("url",(prop.getEndpoint() + "/" + prop.getBucketName() + "/" + objectName));}return R.error();}@ApiOperation(value = "图片/视频预览")@GetMapping("/preview")public R preview(@RequestParam("fileName") String fileName) {return R.ok().put("filleName",minioUtil.preview(fileName));}@ApiOperation(value = "文件下载")@GetMapping("/download")public R download(@RequestParam("fileName") String fileName, HttpServletResponse res) {minioUtil.download(fileName,res);return R.ok();}@ApiOperation(value = "删除文件", notes = "根据url地址删除文件")@PostMapping("/delete")public R remove(String url) {String objName = url.substring(url.lastIndexOf(prop.getBucketName()+"/") + prop.getBucketName().length()+1);minioUtil.remove(objName);return R.ok().put("objName",objName);}}
http://www.lryc.cn/news/187792.html

相关文章:

  • Hadoop----Azkaban的使用与一些报错问题的解决
  • 「新房家装经验」客厅电视高度标准尺寸及客厅电视机买多大尺寸合适?
  • ArduPilot开源飞控之AP_Baro_DroneCAN
  • Supervised Contrastive Pre-training for Mammographic Triage Screening Model
  • JVM技术文档--JVM优化思路以及问题定位--JVM可调整参数汇总
  • Oracle10g数据库迁移方案
  • 备忘录模式:对象状态的保存与恢复
  • C# InvokeRequired线程安全
  • pdf怎么转成jpg图片格式
  • React +ts + babel+webpack
  • 红队专题-REVERSE二进制逆向反编译
  • Spring技术原理之Bean生命周期原理解析
  • Unity实现设计模式——模板方法模式
  • C++实现高性能内存池(二)
  • 沪深300期权一个点多少钱?
  • 怎么防止重要文件夹丢失?文件夹安全如何保护?
  • 用于物体识别和跟踪的下游任务自监督学习-1-引言
  • 式子表达ds类——多用位置/值域表示未知数+区间覆盖转区间加:CF407E
  • Python 实现秒表功能(比较好玩的题目)
  • DALL-E 3调参教程;百度新出的AI写小说神器;通义听悟看播客也太爽了;系列博文带你理解生成式AI | ShowMeAI日报
  • 设计模式-享元模式
  • 中秋时节赏明月,五子棋戏月饼趣 — Flutter中秋限定版五子棋
  • Scala第十九章节
  • kafka与hbase的区别
  • 出栈序列的合法性
  • unity操作_刚体 c#
  • 网络编程中套接字(socket)介绍(Python示例)
  • d3dcompiler_43.dll是什么文件?缺失d3dcompiler_43.dll文件修复与解决方法
  • YOLOv7改进:SPD-Conv,低分辨率图像和小物体涨点明显,涨点神器!!!
  • iris(golang)连接mysql数据库