直接上代码吧,好多文章的下载都写的不明不白的,让人理解错,气死了!!

文件上传功能

文件上传很简单,首先你得部署好minio,然后写好配置信息,我的是动态读取nacos上配置的yml

 @Autowired
private MinioConfig minioConfig; @Autowired
private MinioClient client;
  
@Autowired
private FileInfoMapper fileInfoMapper; /**
* 本地文件上传接口
* @param file 上传的文件
* @return 访问地址
* @throws Exception
*/
@Override
public String uploadFile(MultipartFile file) throws Exception
{
String fileName = FileUploadUtils.extractFilename(file);
PutObjectArgs args = PutObjectArgs.builder()
.bucket(minioConfig.getBucketName())
.object(fileName)
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build();
client.putObject(args);
return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
}
/**
   * 这个属于业务了,可以参考 
* 文件存储路径:
* 业务功能名文件夹+文件UUID+文件类型后缀
* @param file 上传的文件
* @param fileInfo 文件信息表:存储了上传标识等信息(用于区分各个微服务下的各个业务,后面可通过这个标识区分这文件是哪个业务的)
* @return
* @throws Exception
*/
@Override
public int uploadFile(MultipartFile file, FileInfo fileInfo) throws Exception
{
//文件UUID
String uuid= IdUtils.fastSimpleUUID();
//文件目录名称
String fileName = FileUploadUtils.extractFilenameByUuid(file, uuid);
// 文件路径
String url = fileInfo.getSid()+ "/" + fileName; PutObjectArgs args = PutObjectArgs.builder()
.bucket(minioConfig.getBucketName())
.object(fileInfo.getSid()+ "/" + fileName)
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build();
client.putObject(args); //上传到minio后,将文件信息保存
fileInfo.setUid(uuid);
fileInfo.setFileName(file.getOriginalFilename());
fileInfo.setFileSize(file.getSize());
fileInfo.setFileType(FileUploadUtils.getExtension(file));
fileInfo.setFilePath(url);
fileInfo.setCreateBy(SecurityUtils.getUsername());
fileInfo.setCreateTime(DateUtils.getNowDate());
return fileInfoMapper.insertFileInfo(fileInfo);
} 

文件下载功能

这里遇到个理解错误的消息,minio提供的getObject方法和downloadObject方法:

1. getObject

GetObject接口用于获取某个文件(Object)。

此操作需要对此Object具有读权限。

获取对象的数据。

InputStream使用后返回必须关闭以释放网络资源。

2. downloadObject

将对象的数据下载到文件。

我以为downloadObject就是下载的意思(毕竟英文名也是下载的意思),结果他就是不是下载,而是下载到文件。

下载主要参数是文件保存的目录地址,如:system/task/2022/05/11/daebcc866c7f4c7dad34c55b8abff687.png,而不是这样子的:http://192.168.8.116:9000/test/2022/05/11/logo_20220511103344A001.png

因为:http://192.168.1.1:9000/test/   minio会直接在这下面开始查,test为桶名称bucketName

业务层:

   @Autowired
private MinioConfig minioConfig; @Autowired
private MinioClient client; /**
* 下载文件
* @param fileName 下载目录地址 如:system/task/2022/05/11/daebcc866c7f4c7dad34c55b8abff687.png
* @param outputStream http请求中的outputStream
*/
@Override
public void download(String fileName, ServletOutputStream outputStream)
{
try (InputStream inputStream = client.getObject(GetObjectArgs
.builder()
.bucket(minioConfig.getBucketName())
.object(fileName)
.build()))
{
IOUtils.copy(inputStream, outputStream);
}
catch (Exception e)
{
log.error("文件下载异常");
e.printStackTrace();
}
}

控制层

     /**
* 下载文件
* @param uid 文件uid
* @param response
* @throws Exception
*/
@GetMapping("/download/{uid}")
public void download(@PathVariable("uid") String uid,HttpServletResponse response) throws Exception
{
//根据文件UUID,查询文件表,得到文件路径目录
String fileName = fileInfoService.selectFilePathById(uid);
System.out.println(fileName);
//调用业务层下载方法
sysFileService.download(fileName,response.getOutputStream());
} 

springCloud 微服务通过minio实现文件上传和文件下载接口的更多相关文章

  1. Node.js:上传文件,服务端如何获取文件上传进度

    内容概述 multer是常用的Express文件上传中间件.服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题.在SF上也有同学问了类似问题<nodejs multer有没有查看文件 ...

  2. struts2的文件上传和文件下载

    实现使用Struts2文件上传和文件下载: 注意点: (1)对应表单的file1和私有成员变量的名称必须一致 <input type="file" name="fi ...

  3. 分享知识-快乐自己:SpringMvc中的单多文件上传及文件下载

    摘要:SpringMvc中的单多文件上传及文件下载:(以下是核心代码(拿过去直接能用)不谢) <!--设置文件上传需要的jar--> <dependency> <grou ...

  4. minio实现文件上传下载和删除功能

    https://blog.csdn.net/tc979907461/article/details/106673570?utm_medium=distribute.pc_relevant_t0.non ...

  5. 服务端php之文件上传

    知识点 echo $_SERVER['PHP_SELF']; 自动获取当前文件的路劲(即提交地址为当前页面) 当一个表单有文件域(即文件上传)的时候,method(提交方式)要设置post,这样更加安 ...

  6. web服务端安全之文件上传漏洞

    一.文件上传漏洞的原理 由于程序代码未对用户提交的文件进行严格的分析和检查,导致攻击者可以上传可执行的代码文件,从而获取web应用的控制权限. 常见于上传功能,富文本编辑器. 二.文件上传漏洞的防御 ...

  7. spring cloud feign 文件上传和文件下载

    文件上传参考文档:http://blog.didispace.com/spring-cloud-starter-dalston-2-4/ 文件下载参考文档:https://blog.csdn.net/ ...

  8. Struts2文件上传和文件下载

    一.单个文件上传 文件上传需要两个jar包: 首先制作一个简单的页面,用于实现文件上传 <h1>单个文件上传</h1> <s:form action="uplo ...

  9. Struts2 文件上传和文件下载

    一.单个文件上传 文件上传需要两个jar包: 首先制作一个简单的页面,用于实现文件上传 <h1>单个文件上传</h1> <s:form action="uplo ...

随机推荐

  1. JVM学习思考

    毕业以来技术上一直没有太大进步,仔细一想可能是没有做技术分享,我喜欢把学习总结记录在印象笔记中,那么理解的是对是错也就没人能评判一下.为了技术进步,接下来将陆续把一些学习总结迁移到博客园中,欢迎大家多 ...

  2. CommonCollection1反序列化学系

    CommonsCollection1 1.前置知识 1.1.反射基础知识 1.1.1. 对象与类的基础知识 类(class),对象(object) 对象是类的实例化,中华田园犬(object)是狗(c ...

  3. 3. Git安装和使用

    3. Git安装和使用 目的 通过git管理github托管项目代码 下载安装 1)GIt官网下载:https://www.git-scm.com/download/win 2)双击安装 3)选择安装 ...

  4. python学习笔记(六)——程序调试

    在我们平时编写程序时,常常会遇到各种错误,俗称BUG.而我们程序猿的工作常常需要对程序进行调试,也就是所谓的debug. 程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法 ...

  5. CSS详细解读定位

    一 前言 CSS定位是CSS布局只能够重要的一环.本篇文章带你解读定位属性,可以让你更加深入的理解定位带来的一些特性,熟练使用CSS布局. 二 正文 1.文档流布局的概念 将窗体自上而下分成一行行, ...

  6. W3School 教程整理

    离线版大部分整理自 w3cschool ,少部分整理自 w3school ,由本人整理. 感谢 w3cschool 站长的无私奉献. 由于本人精力有限,此处的列表不一定能够及时更新,最新版本请到本人博 ...

  7. 界面跳转+Android Studio Button事件的三种方式

    今天学习界面跳转 java类总是不能新建成功 看了网上教程 (20条消息) 关于android studio无法创建类或者接口问题的解决方法_qq_39916160的博客-CSDN博客 可以新建了 但 ...

  8. Java中 i++和++i 的区别

    学习目标: 理解i++和++i的区别 学习内容: 1.i++ / i- - i++/i- -:遇到 i++或 i- -,i先参与运算,然后 i 再自加或自减1 代码如下: int a = 1; int ...

  9. Java线程内存模型-JVM-底层原理

    public class Demo1 { private static boolean initFlag=false; public static void main(String[] args) t ...

  10. 如何基于 ZEGO SDK 实现 Windows 一对一音视频聊天应用

    互联网发展至今,实时视频和语音通话越来越被大众所依赖. 今天,我们将会继续介绍如何基于ZEGO SDK实现音视频通话功能,前两篇文章分别介绍了Android,Flutter平台的实现方式,感兴趣的小伙 ...