写给大忙人看的 - Java中从MinIO服务器中下载文件(3)

简介: 前面两章介绍了 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

便能成功下载文件了

目录
相关文章
|
16天前
|
搜索推荐 Java 索引
Java中的服务器端渲染(SSR)
Java中的服务器端渲染(SSR)
|
3天前
|
关系型数据库 MySQL Java
|
17天前
|
Java API 开发者
Java中的文件I/O操作详解
Java中的文件I/O操作详解
|
10天前
|
Java 数据格式
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
16 0
|
16天前
|
数据安全/隐私保护
xshell通过堡垒机连接服务器和winscp 通过堡垒机传输文件
【7 月更文挑战第 3 天】xshell通过堡垒机连接服务器和winscp 通过堡垒机传输文件
|
16天前
|
Java
Java之file,创建文件,File f1 = new File(“E:\\itcast\\java.txt“),先f1定路径,在f1.createNewFile()就能够创建文件,mkdir目录
Java之file,创建文件,File f1 = new File(“E:\\itcast\\java.txt“),先f1定路径,在f1.createNewFile()就能够创建文件,mkdir目录
|
17天前
|
JavaScript API
前后端数据交互.js文件的axios的写法,想要往后端发送数据,页面注入API,await的意思是同步等待服务器数据,并返回,axios注入在其他页面,其他页面调用的时候,同步作用
前后端数据交互.js文件的axios的写法,想要往后端发送数据,页面注入API,await的意思是同步等待服务器数据,并返回,axios注入在其他页面,其他页面调用的时候,同步作用
|
18天前
|
Java
Error:java: 错误: 无效的源发行版:13, 类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。
Error:java: 错误: 无效的源发行版:13, 类文件具有错误的版本 61.0, 应为 55.0 请删除该文件或确保该文件位于正确的类路径子目录中。
|
前端开发 Java Linux
Java服务器宕机解决方法论(上)
Java服务器宕机解决方法论(上)
677 0
Java服务器宕机解决方法论(上)
|
Java 调度
Java服务器宕机解决方法论(下)
Java服务器宕机解决方法论(下)
343 0