写给大忙人看的 – Java中从MinIO服务器中下载文件(3)[通俗易懂]

写给大忙人看的 – Java中从MinIO服务器中下载文件(3)[通俗易懂]前面两章介绍了MinIO文件服务器的环境搭建,以及在Java中上传文件至MinIO文件服务器中,现在,一起来看下如何从MinIO文件服务器中下载文件吧1、获取文件对象我们在MinIO工具类中,获取文件对象的方法,即获取文件的输入流对象/***获取文件**@parambucketNamebucket名称*@paramobjectName文件名称*@return二进制流*/@SneakyThrowspublicInputStreamge

大家好,又见面了,我是你们的朋友全栈君。

前面两章介绍了 MinIO 文件服务器的环境搭建,以及在 Java 中上传文件至 MinIO 文件服务器中,现在,一起来看下如何从 MinIO 文件服务器中下载文件吧

1、获取文件对象

我们在 MinIO 工具类中,获取文件对象的方法,即获取文件的输入流对象

/** * 获取文件 * * @param bucketName bucket名称 * @param objectName 文件名称 * @return 二进制流 */
@SneakyThrows
public InputStream getObject(String bucketName, String objectName) { 
   
    return client.getObject(bucketName, objectName);
}
  • bucketName,是指存储桶的名称
  • objectName,是指文件的路径,即存储桶下文件的相对路径

例如,图片的地址为

http://127.0.0.1:9000/bucketName/20200806/1596681603481809.png

那么 objectName 就为

20200806/1596681603481809.png

2、下载文件

我们需要编写一个 API 来进行访问从而下载文件

/** * 获取文件 * * @param bucketName bucket名称 * @param objectName 文件名称 * @return 二进制流 */
@SneakyThrows
public InputStream getObject(String bucketName, String objectName) { 

return client.getObject(bucketName, objectName);
}
/** * 下载文件 * * @param fileUrl 文件绝对路径 * @param response * @throws IOException */
@GetMapping("downloadFile")
public void downloadFile(String fileUrl, HttpServletResponse response) throws IOException { 

if (StringUtils.isBlank(fileUrl)) { 

response.setHeader("Content-type", "text/html;charset=UTF-8");
String data = "文件下载失败";
OutputStream ps = response.getOutputStream();
ps.write(data.getBytes("UTF-8"));
return;
}
try { 

// 拿到文件路径
String url = fileUrl.split("9000/")[1];
// 获取文件对象
InputStream object = minioUtils.getObject(MinioConst.MINIO_BUCKET, url.substring(url.indexOf("/") + 1));
byte buf[] = new byte[1024];
int length = 0;
response.reset();
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(url.substring(url.lastIndexOf("/") + 1), "UTF-8"));
response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8");
OutputStream outputStream = response.getOutputStream();
// 输出文件
while ((length = object.read(buf)) > 0) { 

outputStream.write(buf, 0, length);
}
// 关闭输出流
outputStream.close();
} catch (Exception ex) { 

response.setHeader("Content-type", "text/html;charset=UTF-8");
String data = "文件下载失败";
OutputStream ps = response.getOutputStream();
ps.write(data.getBytes("UTF-8"));
}
}

这里传入的参数 fileUrl 为文件的绝对路径,即可以直接访问的路径,还需要通过此路径,截取得到文件的相对路径(即去掉 IP 地址和端口,去掉存储桶名称的路径)

3、测试

通过访问 API

http://127.0.0.1/minio/downloadFile?fileUrl=http://127.0.0.1:9000/bucketName/20200806/1596681603481809.png

便能成功下载文件了

如您在阅读中发现不足,欢迎留言!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158221.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux目录结构详解_简述linux系统中的目录结构

    linux目录结构详解_简述linux系统中的目录结构前言平常linux系统用的也不少,那么linux下的每个目录都是用来干什么的,小伙伴们有仔细研究过吗?让我们来了解下吧Linux系统目录结构登录系统后,在当前命令窗口下输入命令:[root@

  • java.lang.Integer常用方法

    java.lang.Integer常用方法+构造函数Integer(intvalue)通过指定的int值构成一个Integer对象。Integer(Strings)通过指定的String值构成一个Integer对象。。+方法int intValue()将此对象转化为int。long longValue()将此对象转化为long。byte byteValue()将此对象转化为byte。sho…

  • ubuntu安装python pip_anaconda pipenv

    ubuntu安装python pip_anaconda pipenv简单介绍在Ubuntu上安装Python的virtualenv前提:本机安装了Linux系统(这里推荐用Ubuntu安装,或是CentOS)(Ubuntu的安装比较简单,推荐用VirtualBox,可以去Oracle官网下载VirtualBox(https://www.virtualbox.org/),然后去Ubuntu官网(https://www.ubuntu.com/download)…

  • springbean的生命周期详细_fragment生命周期详解

    springbean的生命周期详细_fragment生命周期详解SpringBean生命周期详解一、简述:Spring是我们每天都在使用的框架,Bean是被Spring管理的Java对象,是Spring框架最重要的部分之一,那么让我们一起了解一下Spring中Bean的生命周期是怎样的吧二、流程图我们先从宏观的角度看一下Spring的生命周期:![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028174058916.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5

  • android studio飞机大战游戏带注释源码教程(多线程)[通俗易懂]

    android studio飞机大战游戏带注释源码教程(多线程)[通俗易懂]第一次发博客,学了3天的androidstudio还有一点以前的java基础做了个飞机大战的游戏游戏比较简单大概就这几个功能1.会动的背景2.我的飞机3.发射子弹3.敌人飞机第一步新建一个项目我用的是Android4.4版本新建好项目之后xml文件之类的什么都不用管先新建个类叫做huahua.javapackagecom.dahuijii.liziguo;importandroid.c…

  • カード名義_acm题

    カード名義_acm题原题链接给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n。有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。输入格式输入第一行包括一个整数 表示节点个数;接下来 n 行每行一对整数 a 和 b,表示 a 和 b 之间有一条无向边。如果 b 是 −1,那么 a 就是树的根;第 n+2 行是一个整数 m 表示询问个数;接下来 m 行,每行两个不同的正整数 x 和 y,表示一个询问。输出格式对于每一个询问,若 x 是 y 的祖先则输

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号