Minio的图片下载

2024-06-02 02:44
文章标签 minio 图片下载

本文主要是介绍Minio的图片下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 为什么要写下载?

正常使用Minio的时候,其实是不用单独再写下载功能的,因为使用Minio上传的时候,可以再返回结果里带上地址,可直接点击地址进行下载,可如果现在既要预览又要下载,就需要单独写一个下载功能.

1 代码如下

Minio使用的初始化

    private void init() {minioClient = MinioClient.builder().endpoint(config.getMinioEndPoint()).credentials(config.getMinioAccessKey(), config.getMinioSecretKey()).build();}

Minio图片下载的业务代码

    @Override//下载public void download(String folderPath, HttpServletResponse res,String fileName) {GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(config.getMinioBucketName()).object(folderPath).build();try (GetObjectResponse response = minioClient.getObject(objectArgs)) {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.addHeader("Content-Disposition", "attachment;fileName=" + fileName);try (ServletOutputStream stream = res.getOutputStream()) {stream.write(bytes);stream.flush();}}} catch (Exception e) {e.printStackTrace();}}

Minio的下载接口 

@GetMapping("download")@Operation(summary = "下载文件")public void download(@RequestParam String fileName, HttpServletResponse res) {String url = ossService.getUrl(fileName);String[] parts = url.split("/");int fileIndex = parts.length - 1;String name = parts[fileIndex];String filePath = String.join("/", Arrays.copyOfRange(parts, 4, fileIndex));String folderPath = filePath + "/" + name;OssFactory.build().download(folderPath, res, fileName);}

2 总结

  • 初始化Minio的使用.
  • 通过 Minio 客户端获取指定路径的对象数据,并将其读取到内存中的字节数组中。
  • 设置 HTTP 响应头中的 Content-Disposition 为 attachment,告诉浏览器将响应内容作为附件下载。同时设置文件名 fileName
  • 获取 HTTP 响应输出流(ServletOutputStream)。
  • 将之前读取的字节数组写入到响应输出流中。
  • 刷新输出流,将数据发送给客户端。
    •  响应输出流(ServletOutputStream):
    1. 直接将文件数据写入到响应输出流中,避免了先将整个文件读取到内存中的开销。
    2. 可以设置 HTTP 响应头来控制浏览器的下载行为,如强制下载、文件名等。
    3. 适用于各种类型的文件下载需求,简单易用。
  • FastByteArrayOutputStream 是一个自定义的字节数组输出流实现,主要用于提高 I/O 操作的性能。它与标准的 ByteArrayOutputStream 相比,有以下几个特点:
  1. 内部使用了一个可变大小的字节数组来存储数据,而不是使用固定大小的数组。这样可以减少内存分配和复制的开销。

  2. 在写入数据时,它会先检查当前数组是否足够大,如果不够则会自动扩展数组。这样可以避免频繁的数组扩容操作。

  3. 它还提供了一些额外的方法,如 toByteArrayUnsafe() 可以直接返回内部数组,而不需要复制数据。

相比于标准的 ByteArrayOutputStreamFastByteArrayOutputStream 在处理大量数据时能提供更好的性能。这在文件下载这种场景下非常有用,因为可以减少内存分配和复制的开销,从而提高整体的下载速度。

在示例代码中,使用 FastByteArrayOutputStream 来缓存从 Minio 获取的文件数据,然后再一次性写入到响应输出流中。这种方式可以避免将整个文件一次性读取到内存中,从而降低内存使用。

这篇关于Minio的图片下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022817

相关文章

Linux(Centos7)安装Mysql/Redis/MinIO方式

《Linux(Centos7)安装Mysql/Redis/MinIO方式》文章总结:介绍了如何安装MySQL和Redis,以及如何配置它们为开机自启,还详细讲解了如何安装MinIO,包括配置Syste... 目录安装mysql安装Redis安装MinIO总结安装Mysql安装Redis搜索Red

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

docker基于minio部署outline团队知识库

outline 介绍 Outline 是一个开源的Wiki 知识库和团队协作文档管理工具,美观、实时协作、功能丰富且兼容 Markdown,设计用于帮助团队和组织有效地创建、共享和管理文档。 Outline 具有简单易用的界面和强大的功能,可以替代传统的文档管理系统,如 Google Docs 或 Confluence。Outline 提供了一种结构化的方式来组织信息,使团队成员可以快速访问和

Minio 高性能分布式对象存储快速入手指南

0x00 Minio 快速入门 什么是对象存储? 描述: 对象存储(Object Storage)是一种存储数据的计算机体系结构,它以对象的形式存储和管理数据。与传统的文件系统和块存储不同,对象存储将数据作为对象存储在分布式的存储集群中,每个对象都有一个唯一的标识符(通常是一个URL),并且可以通过这个标识符来访问和检索数据。 「对象存储特点」: 弹性扩展:对象存储可以轻松地扩展存储容量,

Docker 部署 Minio (图文并茂超详细)

部署 Minio ( Docker ) [Step 1] : 拉取 Minio 镜像 docker pull minio/minio [Step 2] : 启动 Minio 容器 docker run --name minio --restart=always \-p 9000:9000 -p 9090:9090 \-e "MINIO_ROOT_USER=minio"

SpringBoot整合Minio及阿里云OSS(配置文件无缝切换)

SpringBoot整合Minio及阿里云OSS 文章目录 SpringBoot整合Minio及阿里云OSS1.Minio安装测试1.Docker安装启动容器 2.创建bucket3.上传文件修改权限 2.SpringBoot整合Minio及阿里云OSS1.公共部分抽取2.Minio配置整合1.添加pom依赖2.添加配置文件3.操作接口实现 3.阿里云OSS配置整合1.pom依赖2.添加

【对象存储 minio】linux 单机版minio安装教程

一、minio是什么? MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。 ​ MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MyS

mhtml图片提取 百度图片下载

如果你需要找一些图片,可以先去百度一下,待相关网页加载完成后,点击保存,即可得到一个mhtml文件。这个文件里的图片会用base64进行存储,只需要找到他们并转化就可以。目前在美篇之类的网站上效果还一般,需要继续排查问题。 效果 代码 大概分为提取所有base64、转化为图片两步。 import base64from io import BytesIOfrom PIL import

minio实现大文件断点续传

最近工作中遇到一个需求,用户需要上传大文件几百M,为了更好的用户体验,需要支持断点续传,秒传,上传进度条等功能。需求如下:     方案有两种:     第一种:前端直接将整个大文件丢到后端,由后端来处理。后端收到文件后首先将文件分片,分片好后再将文件上传至文件服务器minio,上传期间前端通过轮询后端提供的上传进度接口展示进度,或者和后端建立websocket连接,后端推送进度前