写给大忙人看的 – 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

便能成功下载文件了

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PyCharm中的全局搜索

    PyCharm中的全局搜索根据每个人的快捷键设置每个人可能都不一样。具体方法是打开设置(File->Settings),找到keymap选项。然后在左边的搜索框中搜索findinpath得到的快捷键就是全局搜索的快捷键,我的是Ctrl+H。效果如下图所示:…

    2022年5月6日
    51
  • 一篇文章,Vue快速入门!!!

    一篇文章,Vue快速入门!!!①Vue概述及第一个Vue程序(HelloWorld)1.1什么是MVVMMVVM(Model-View-ViewModel)是一种软件设计模式,由微软WPF(用于替代WinForm,以前就是用这个技术开发桌面应用程序的)和Silverlight(类似于JavaApplet,简单点说就是在浏览器上运行WPF)的架构师KenCooper和TedPeters开发,是一种简化用户界面的事件驱动编程方式。由JohnGossman(同样也是WPF和Sliverlight的架构师)与2005年在他的

    2022年5月4日
    52
  • manage.py作用_python源码库

    manage.py作用_python源码库源码目录结构ApiResponse这个类没啥好说的classApiResponse(Response):"""继承了requests模块中的Response类

    2022年7月30日
    9
  • python最新激活码2021【在线注册码/序列号/破解码】「建议收藏」

    python最新激活码2021【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    1.7K
  • Pytest(15)pytest分布式执行用例「建议收藏」

    Pytest(15)pytest分布式执行用例「建议收藏」前言平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间

    2022年7月28日
    49
  • c#中executeNonQuery执行异常怎么处理_getchar的返回值

    c#中executeNonQuery执行异常怎么处理_getchar的返回值SqlCommand.ExecuteNonQuery方法对连接执行Transact-SQL语句并返回受影响的行数。备注: 可以使用ExecuteNonQuery来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行UPDATE、INSERT或DELETE语句,在不使用DataSet的情况下更改数据库中的数据。     虽然ExecuteNonQuer

    2025年10月27日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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