java minio通过getPresignedObjectUrl设置(自定义)预签名URL下载文件的响应文件名之minio源码改造方案

Minio预签名URL自定义响应文件名之Minio源码改造

  • 需求说明
  • Minio源码改造
    • 一、环境准备
    • 二、下载Minio源代码
    • 三、修改源代码
        • 1.修改cmd目录下的api-router.go这个代码文件
        • 2.将filename参数值设置到响应头
        • 4.修改验证签名时是否需要带入filename参数验证
    • 四、大功告成,编译go代码生成可执行文件
        • 本机运行打包命令
        • ARM打包命令
        • AMD打包命令
    • 五、使用预签名URL下载文件测试

需求说明

用户上传文件到Minio时,一般存储在Minio中的对象名称都是后端以UUID或者其他随机或非随机方案生成的唯一标识做为文件名,这个对象名称一般都不会是用户上传时的原文件名称。

在用户下载时,想让文件流不通过后端服务器,而是用户直接申请并使用某个要下载对象的Minio预签名的url,直接从Minio所部署的服务器下载该文件。

但是浏览器通过预签名的url下载文件时,由于无法自定义Minio下载文件的请求响应头中的文件名称,所以在浏览器下载时,保存的文件名是以对象名称进行保存的,那么这个文件名是对用户感知等都是不友好的。

所以需要根据预签名url下载文件(我这里是用GET)请求中的filename参数,把响应头的Content-Disposition内容上指定文件名称

注:本方案是修改Minio源代码实现该功能,因为Minio好像没有实现这个功能

Minio源码改造

一、环境准备

这里大家自己百度查询相关教程

  • Go语言环境,并设置好Go的依赖下载代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
  • GoLand编辑器(当然用别的也行)

我使用的go版本:go version go1.21.0 linux/amd64

二、下载Minio源代码

使用git下载

git clone https://github.com/minio/minio.git

三、修改源代码

1.修改cmd目录下的api-router.go这个代码文件

搜索改文件内容:GetObjectHandler
在这里插入图片描述

进入api.GetObjectHandler这个handler查看代码,在这个函数前面加上一个自定义的函数GetUrlArgs,这个函数的功能是获取GET请求url中的某个参数值

/**
获取URL的get参数
*/
func GetUrlArgs(r *http.Request, name string) string {var arg stringvalues := r.URL.Query()arg = values.Get(name)return arg
}

在这里插入图片描述

2.将filename参数值设置到响应头

在这个函数里面,添加这段代码,作用是将请求url中的filename参数值设置到响应头的Content-Disposition中

	// 将filename参数值添加到响应头做为响应名var filename string = GetUrlArgs(r, "filename")if filename != "" {// 该写法可以解决中文文件名乱码问题w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename*=UTF-8''%s", url.QueryEscape(filename)))}

在这里插入图片描述

4.修改验证签名时是否需要带入filename参数验证

如果你在获取预签名url时,就携带了filename参数,就不用做这一步了,那么这个预签名url的任何参数值都是不能被更改的,包括filename。

例如我的java minio客户端获取预签名url代码:

		Map<String, String> query = new HashMap<>(2, 1);query.put("filename", responseFileName);GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName)  // 对象名称.expiry(10, TimeUnit.SECONDS) // 该url签名10秒过期.method(Method.GET)  // 该url允许的请求方式.extraQueryParams(query) // 把filename加在查询字符串上.build();// 创建预签名urlString preSignedObjectUrl = minioClient.getPresignedObjectUrl(args);

如果你在获取预签名url时根本就没有携带上filename进行url预签名,而是想让前端或者请求者在url上加上filename=xxx这个参数,文件名可以随便由请求者设置,那么就需要修改Minio源码中的验证签名操作,让filename这个参数不参与到验证签名中。

例如这是java minio客户端不带filename参数创建预签名url的代码:

        GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName)  // 对象名称.expiry(10, TimeUnit.SECONDS) // 该url签名10秒过期.method(Method.GET)  // 该url允许的请求方式.build();// 创建预签名urlString preSignedObjectUrl = minioClient.getPresignedObjectUrl(args);

修改Minio源码不让filename参与到验证签名的操作步骤:
代码文件:cmd/signature-v4.go
搜索函数:doesPresignedSignatureMatch
在该函数的这个循环中,修改这个循环,判断条件中加入参数k不是filename的条件即可,加入的是图中红色方框这里的代码

	//Add missing query parameters if any provided in the request URLfor k, v := range req.Form {if !defaultSigParams.Contains(k) && k != "filename" {query[k] = v}}

在这里插入图片描述

四、大功告成,编译go代码生成可执行文件

按需执行以下命令,下载好相关依赖之后,就会编译生成一个可执行文件minio,当然这个可执行文件名可以在命令中修改,打包之后,这个可执行文件就是可以和官方下载的可执行文件一样运行了,依旧按照官方的文档使用。

本机运行打包命令
go build main.go
ARM打包命令
# CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o 可执行文件名 main.go
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o minio main.go
AMD打包命令
# CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o 可执行文件名 main.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o minio main.go

五、使用预签名URL下载文件测试

我获取预签名url是设置的filename是a.txt,存储在Minio中是一大长串xxxxxx.txt,浏览器保存的文件名也是a.txt。如果是中文名的话会自动进行编码后响应,浏览器能自动转码为中文文件名进行保存。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

残差网络中的BN (Batch Normalization 批标准化层)的作用是什么?

文章目录 什么是BN &#xff08;Batch Normalization 批标准化层&#xff09;一、BN层对输入信号进行以下操作:二、BN 层有什么作用&#xff1f; 什么是BN &#xff08;Batch Normalization 批标准化层&#xff09; BN层的全称是Batch Normalization层,中文可以翻译为批标准化…

如何让.NET应用使用更大的内存

我一直在思考为何Redis这种应用就能独占那么大的内存空间而我开发的应用为何只有4GB大小左右&#xff0c;在此基础上也问了一些大佬&#xff0c;最终还是验证下自己的猜测。 操作系统限制 主要为32位操作系统和64位操作系统。 每个进程自身还分为了用户进程空间和内核进程空…

【C语言】7-55 分寝室 分数 20

7-55 分寝室 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 学校新建了宿舍楼&#xff0c;共有 n 间寝室。等待分配的学生中&#xff0c;有女生 n0​ 位、男生 n1​ 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去&#xff0c;最后不能有寝室留空…

Mybatis-Spring整合原理:MapperFactoryBean和MapperScannerConfigurer的区别及源码剖析

文章目录 引言MapperFactoryBean的用法和优缺点MapperScannerConfigurer的用法和优缺点MapperFactoryBean源码分析MapperScannerConfigurer源码分析Spring容器初始化流程回顾核心方法&#xff1a;postProcessBeanDefinitionRegistryBeanDefinitionRegistryPostProcessor和BeanF…

Java 并发编程(六)-Fork/Join异步回调

一、并发编程 1、Fork/Join分支合并框架 Fork/Join它可以将一个大的任务拆分成多个子任务进行并行处理&#xff0c;最后将子任务结果合并成最后的计算结果&#xff0c;并进行输出。Fork/Join框架要完成两件事情&#xff1a; Fork&#xff1a;把一个复杂任务进行分拆&#xff0…

BP神经网络原理,基于BP神经网络的去噪算法,基于BP神经网络的调制信号去噪

目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法原理 遗传算法主要参数 遗传算法流程图 完整代码包含数据下载链接: 基于BP神经网络的去噪算法,基于BP神经网络的调制信号去噪(代码…

下午好~ 我的论文【CV边角料】(第三期)

文章目录 CV边角料Pixel ShuffleSENetCBAMGlobal Context Block (GC)Criss-Cross Attention modules (CC) CV边角料 Pixel Shuffle Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network pixelshuffle算法的实现流…

EXCEL SUM类函数

目录 一. SUM二. SUMIF三. SUMIFS四. SUMPRODUCT 一. SUM ⏹对一列或一组单元格中的数字进行求和。 基本语法 SUM(number1, [number2], ...)✅统计所有产品的总数量 SUM(C2:C13) 二. SUMIF ⏹按照特定条件对范围内的单元格进行求和的函数。 基本语法 SUMIF(条件区域, 指定…

山西电力市场日前价格预测【2023-12-16】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-16&#xff09;山西电力市场全天平均日前电价为259.00元/MWh。其中&#xff0c;最高日前电价为333.74元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

Golang 二分查找 LEETCODE704 小记

二分查找 leetcode704 前面部分第4题&#xff0c;包括使用条件等感谢代码随想录&#xff1a;&#xff09; leetcode704 二分查找用于在有序且不重复的元素列表中寻找需要的元素&#xff0c;返回其位置或错误 当要求算法的时间复杂度在O&#xff08;logn) 等带log的复杂度时&am…

C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数

目录 一、编写程序&#xff0c;输入三个字符串&#xff0c;比较它们的大小&#xff0c;并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用&#xff0c;并用指向函数的指针作为函数的参数。 1.不使用函数指针作为参数&#xff0c;并自己模拟strcmp。 …

Flume 安装与部署

目录 Flume 下载地址 &#xff08;1&#xff09;将 apache-flume-1.9.0-bin.tar.gz 上传到 linux 的 /opt/software 目录下 &#xff08;2&#xff09;解压 apache-flume-1.9.0-bin.tar.gz 到 /opt/module/ 目录下 huweihadoop101 ~]$ tar -zxvf /opt/software/apache-flume-…

001 Windows虚拟机

一、虚拟机安装Windows10 选自定义安装 升级是针对你电脑上有系统的情况下&#xff0c;你要升级&#xff1b;没有系统就选择自定义。 硬盘60G 直接单击下一步就是一个盘 如果你想对磁盘进行分区 分第一个区的时候它会去创建系统的保留分区和系统分区&#xff0c;然后还剩20…

acwing算法提高之动态规划--状态压缩DP

目录 1 基础知识2 模板3 工程化 1 基础知识 暂无。。。 2 模板 暂无。。。 3 工程化 题目1&#xff1a;小国王。 解题思路&#xff1a;状态压缩DP。 状态定义f[i][j][a]&#xff1a;表示已经考虑了前i行&#xff0c;并且摆放了j个国王&#xff0c;且第i行的状态是a的总方…

qt程序在Linux下打包的一般流程

编译 手动编写编译脚本 qmake make复制依赖库 参考文章&#xff1a; https://blog.csdn.net/JOBbaba/article/details/124289626 https://zhuanlan.zhihu.com/p/49919048 复制系统依赖库 编写复制脚本copy.sh ldd复制Qt依赖库 主要是libqxcb.so的相关依赖需要复制&…

流量分析基础

定义&#xff1a; 流量分析&#xff08;Traffic Analysis&#xff09;是指对网络流量数据进行分析和解释&#xff0c;以获得有关网络中通信的信息和情报。这种技术可以用于网络安全、网络管理和网络优化等领域。 网络流量包含了许多有关网络通信的细节信息&#xff0c;如源IP地…

Linux c++开发-06-使用Linux API 进行文件的读写

先简单的介绍一下open,read,write 先用open接口去打开文件&#xff0c;flag表示打开文件的权限不同。 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);示例 结果&#xff1a;

AD9361 Evaluation Software配置脚本转换工具

最近在玩一个开源的AD9361项目&#xff0c;AD9361采用纯逻辑配置&#xff0c;不需要ARM或者MicroBlaze。其中&#xff0c;先是用AD9361 Evaluation Software生成配置脚本&#xff0c;再转换成ad9361_lut.v。 在网上查了一圈&#xff0c;有个转换工具叫bit_converter&#xff0…

经典深度学习算法【1】:K-近邻算法(KNN)概述

最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来&#xff0c;当测试对象的属性和某个训练对象的属性完全匹配时&#xff0c;便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢&#xff0c;其次就是存在一个测试对象同时与多个训练…

跟我学c++高级篇——C++26反射预览

一、c23的反射跳票 本来按照预定&#xff0c;c23中反射就应该比较全的。结果&#xff0c;由于众所周知的原因&#xff0c;线上会议肯定是不如线下会议效率高&#xff0c;那么反射这种对于c不太急切的功能&#xff08;当然&#xff0c;也有其它原因&#xff09;只能向后放一放。…