1、minio部署

1.1 拉取镜像

docker pull minio/minio

1.2 创建数据目录

mkdir -p /home/guanz/minio
mkdir -p /home/guanz/minio/midata

1.3 启动minio

docker run -d -p 9000:9000 -p 9001:9001 --restart=always -e MINIO_ACCESS_KEY=guanz -e MINIO_SECRET_KEY=guanz@123 -v $PWD/midata:/data  minio/minio server /data --console-address "192.168.1.139:9001"

2、项目搭建

2.1 引入jar

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

2.2 application-dev.yml

springminio:# Minio服务器地址endpoint: http://192.168.1.139:9000port: 9001create-bucket: truebucketName: push-test# Minio服务器账号accessKey: guanz# Minio服务器密码secretKey: guanz@123secure: falseconfigDir: /home/push# 文件大小 单位MmaxFileSize: 10expires: 604800

2.4 MinioConfig.java

package com.pavis.app.saasbacken.config;import io.minio.MinioClient;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;/*** @program: push-saas* @description:* @author: Guanzi* @created: 2021/11/02 13:47*/
@Data
@Component
@ConfigurationProperties(prefix = "minio")
@Slf4j
@Configuration
public class MinioConfig {@ApiModelProperty("endPoint是一个URL,域名,IPv4或者IPv6地址")@Value("${spring.minio.endpoint}")private String endpoint;@ApiModelProperty("TCP/IP端口号")@Value("${spring.minio.port}")private int port;@ApiModelProperty("accessKey类似于用户ID,用于唯一标识你的账户")@Value("${spring.minio.accessKey}")private String accessKey;@ApiModelProperty("secretKey是你账户的密码")@Value("${spring.minio.secretKey}")private String secretKey;@ApiModelProperty("如果是true,则用的是https而不是http,默认值是true")@Value("${spring.minio.secure}")private Boolean secure;@ApiModelProperty("默认存储桶")@Value("${spring.minio.bucketName}")private String bucketName;@ApiModelProperty("配置目录")@Value("${spring.minio.configDir}")private String configDir;@ApiModelProperty("文件大小")@Value("${spring.minio.maxFileSize}")private Integer maxFileSize;@ApiModelProperty("签名有效时间")@Value("${spring.minio.expires}")private Integer expires;/*** 注入minio 客户端* @return*/@Beanpublic MinioClient minioClient(){log.info("endpoint:{},port:{},accessKey:{},secretKey:{},secure:{}",endpoint, port, accessKey, secretKey,secure);return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
}

3、文件上传

3.1 关键代码

MinioController.java
/*** 文件上传* @param file* @return*/@PostMapping("/upload")public Map<String, Object> upload(MultipartFile file){return minioService.upload(file);}
MinioServiceImpl.java
@Overridepublic Map<String, Object> upload(MultipartFile file) {Map<String, Object> res = new HashMap<>();try {BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(bucketName).build();// todo 检查bucket是否存在。boolean found = minioClient.bucketExists(bucketArgs);PutObjectArgs objectArgs = PutObjectArgs.builder().object(file.getOriginalFilename()).bucket(bucketName).contentType(file.getContentType()).stream(file.getInputStream(), file.getSize(), -1).build();ObjectWriteResponse objectWriteResponse = minioClient.putObject(objectArgs);System.out.println(objectWriteResponse.etag());res.put("code", "1");res.put("mess", "ok");return res;} catch (Exception e) {e.printStackTrace();log.info(e.getMessage());}res.put("code", "0");return res;}

4、文件下载

@Overridepublic void download(String filename, HttpServletResponse res) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(bucketName).build();boolean bucketExists = minioClient.bucketExists(bucketArgs);log.info("bucketExists:{}", bucketExists);GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName).object(filename).build();System.err.println("objectArgs:" + JSON.toJSONString(objectArgs));try (GetObjectResponse response = minioClient.getObject(objectArgs)) {System.err.println("response:" + JSON.toJSONString(response));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();}
}
下载地址:

5、文件永久链接下载

5.1 配置

5.2 关键代码

/*** 生成一个GET请求的分享链接。* 失效时间默认是7天。** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @param expires    失效时间(以秒为单位),默认是7天,不得大于七天* @return*/public String presignedGetObject(String bucketName, String objectName, Integer expires) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(bucketName).build();boolean bucketExists = minioClient.bucketExists(bucketArgs);// boolean flag = bucketExists(bucketName);String url = "";if (bucketExists) {try {if (expires == null){expires = 604800;}GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(objectName)// .expiry(expires).build();url = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs);log.info("*******url2:{}",url);} catch (Exception e) {log.info("presigned get object fail:{}",e);}}return url;}
下载地址:
http://192.168.1.139:9000/push-test/qiyeku.jpg
至此,springboot+minio 结束。

springboot整合minio,实现文件上传与下载,且支持链接永久访问相关推荐

  1. Springboot中常用的文件上传和下载通用接口

    记录下通用的文件上传和下载接口,一般的开发中都是会使用到的,不过写的最简单的版本. 文章目录 程序测试 本文小结 程序测试 在yml中配置一个文件保存的路径 #保存文件的路径 common:file: ...

  2. springboot 整合 oss进行文件上传

    提示:没开通的先开通 操作OSS云服务 1.进入管理控制台 2.创建bucket 3.设置内容 4.上传文件 5.扫描上传文件 6.查看文件详情 7.点击头像,选择AccessKey管理 8.继续使用 ...

  3. Springboot实现简单的文件上传和下载功能

    一.第一步, 第一步依然是创建数据库,我简单设计了三个字段(file_id,file_name,create_time) CREATE TABLE `txtfile` (`file_id` int N ...

  4. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    SpringBoot整合阿里云OSS文件上传.下载.查看.删除 该项目源码地址:https://github.com/ggb2312/springboot-integration-examples ( ...

  5. SpringBoot整合阿里云OSS,支持文件上传、下载、删除、加签等操作

    首先附上OSS基本介绍和官方文档链接:https://help.aliyun.com/product/31815.html?spm=ata.21736010.0.0.25d67536bR4cly 另外 ...

  6. springboot整合阿里云oss上传的方法示例

    这篇文章主要介绍了springboot整合阿里云oss上传的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 OSS申请和 ...

  7. SpringBoot下文件上传与下载的实现

    原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...

  8. SpringBoot 文件上传、下载、设置大小

    本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...

  9. 一篇文章教你学会使用SpringBoot实现文件上传和下载

    文章目录 一.搭建SpringBoot开发环境 1.创建项目 2.配置application.properties参数 3.实体响应类和异常信息类 4.创建FileController 二.接口测试 ...

  10. springBoot 简单优雅是实现文件上传和下载

    前言 好久没有更新spring Boot 这个项目了.最近看了一下docker 的知识,后期打算将spring boot 和docker 结合起来.刚好最近有一个上传文件的工作呢,刚好就想起这个脚手架 ...

最新文章

  1. 计算机基本知识培训稿,计算机基础知识培训稿.doc
  2. tf.keras.losses.SquaredHinge 损失函数 示例
  3. JavaWeb_域对象的属性操作
  4. cakephp视图用php文件,CakePHP - 扩展视图( Extending Views)
  5. AssertionError: nn criterions don‘t compute the gradient w.r.t. targets
  6. 华为双 11 发 20 亿奖金!?
  7. idea 导入spring 源码 踩坑记总结整理
  8. 现代电力系统分析王锡凡pdf_一对一论文定制 | 电子工程:电力系统潮流及最优潮流算法研究...
  9. 图解react设计理论基础
  10. ubuntu下解决微信不能发送图片的问题
  11. Log4j发送日志到服务器上
  12. LWC 71: 780. Reaching Points
  13. python处理csv文件缺失值_用Python处理数据集中的缺失值
  14. selenium报错信息-- Python 中 ‘unicodeescape‘ codec can‘t decode bytes in position XXX: trun错误解决方案
  15. imuupdate() 解算
  16. linux nand 驱动,Linux NAND FLASH驱动分析(一)
  17. 亚航app航班价格抓取
  18. CH32F203C8T6 32位增强型低功耗Cortex-M3单片机
  19. Java Mail解决标题乱码:???
  20. Pandas批量拆分Excel与合并Excel(十四)

热门文章

  1. MIL-100(Cr),cas840523-88-8
  2. 和日本留学同学聊天想到的
  3. 调度系统的几个核心功能
  4. 20 张图告诉你,如何实现一个任务调度系统
  5. python基本操作知识_python 入门基本知识
  6. 大众点评 App 搜索基于知识图谱的深度学习排序实践
  7. 电脑清洁和消毒操作指南
  8. unity中UDP通信
  9. postfix + dovecot
  10. 2020-12-29 财务报表