springboot整合minio,实现文件上传与下载,且支持链接永久访问
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,实现文件上传与下载,且支持链接永久访问相关推荐
- Springboot中常用的文件上传和下载通用接口
记录下通用的文件上传和下载接口,一般的开发中都是会使用到的,不过写的最简单的版本. 文章目录 程序测试 本文小结 程序测试 在yml中配置一个文件保存的路径 #保存文件的路径 common:file: ...
- springboot 整合 oss进行文件上传
提示:没开通的先开通 操作OSS云服务 1.进入管理控制台 2.创建bucket 3.设置内容 4.上传文件 5.扫描上传文件 6.查看文件详情 7.点击头像,选择AccessKey管理 8.继续使用 ...
- Springboot实现简单的文件上传和下载功能
一.第一步, 第一步依然是创建数据库,我简单设计了三个字段(file_id,file_name,create_time) CREATE TABLE `txtfile` (`file_id` int N ...
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
SpringBoot整合阿里云OSS文件上传.下载.查看.删除 该项目源码地址:https://github.com/ggb2312/springboot-integration-examples ( ...
- SpringBoot整合阿里云OSS,支持文件上传、下载、删除、加签等操作
首先附上OSS基本介绍和官方文档链接:https://help.aliyun.com/product/31815.html?spm=ata.21736010.0.0.25d67536bR4cly 另外 ...
- springboot整合阿里云oss上传的方法示例
这篇文章主要介绍了springboot整合阿里云oss上传的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 OSS申请和 ...
- SpringBoot下文件上传与下载的实现
原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...
- SpringBoot 文件上传、下载、设置大小
本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...
- 一篇文章教你学会使用SpringBoot实现文件上传和下载
文章目录 一.搭建SpringBoot开发环境 1.创建项目 2.配置application.properties参数 3.实体响应类和异常信息类 4.创建FileController 二.接口测试 ...
- springBoot 简单优雅是实现文件上传和下载
前言 好久没有更新spring Boot 这个项目了.最近看了一下docker 的知识,后期打算将spring boot 和docker 结合起来.刚好最近有一个上传文件的工作呢,刚好就想起这个脚手架 ...
最新文章
- 计算机基本知识培训稿,计算机基础知识培训稿.doc
- tf.keras.losses.SquaredHinge 损失函数 示例
- JavaWeb_域对象的属性操作
- cakephp视图用php文件,CakePHP - 扩展视图( Extending Views)
- AssertionError: nn criterions don‘t compute the gradient w.r.t. targets
- 华为双 11 发 20 亿奖金!?
- idea 导入spring 源码 踩坑记总结整理
- 现代电力系统分析王锡凡pdf_一对一论文定制 | 电子工程:电力系统潮流及最优潮流算法研究...
- 图解react设计理论基础
- ubuntu下解决微信不能发送图片的问题
- Log4j发送日志到服务器上
- LWC 71: 780. Reaching Points
- python处理csv文件缺失值_用Python处理数据集中的缺失值
- selenium报错信息-- Python 中 ‘unicodeescape‘ codec can‘t decode bytes in position XXX: trun错误解决方案
- imuupdate() 解算
- linux nand 驱动,Linux NAND FLASH驱动分析(一)
- 亚航app航班价格抓取
- CH32F203C8T6 32位增强型低功耗Cortex-M3单片机
- Java Mail解决标题乱码:???
- Pandas批量拆分Excel与合并Excel(十四)