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

这篇具有很好参考价值的文章主要介绍了java minio通过getPresignedObjectUrl设置(自定义)预签名URL下载文件的响应文件名之minio源码改造方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求说明

用户上传文件到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
minio getpresignedobjecturl,java,开发语言,oss,minio,minio预签名url,minio预签名链接,minio自定义下载文件名

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

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

minio getpresignedobjecturl,java,开发语言,oss,minio,minio预签名url,minio预签名链接,minio自定义下载文件名

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)))
	}

minio getpresignedobjecturl,java,开发语言,oss,minio,minio预签名url,minio预签名链接,minio自定义下载文件名

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();
        // 创建预签名url
        String 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();
        // 创建预签名url
        String preSignedObjectUrl = minioClient.getPresignedObjectUrl(args);

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

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

minio getpresignedobjecturl,java,开发语言,oss,minio,minio预签名url,minio预签名链接,minio自定义下载文件名

四、大功告成,编译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。如果是中文名的话会自动进行编码后响应,浏览器能自动转码为中文文件名进行保存。
minio getpresignedobjecturl,java,开发语言,oss,minio,minio预签名url,minio预签名链接,minio自定义下载文件名文章来源地址https://www.toymoban.com/news/detail-822708.html

到了这里,关于java minio通过getPresignedObjectUrl设置(自定义)预签名URL下载文件的响应文件名之minio源码改造方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 成功实现通过网址URL截图保存

    实操 DjNativeSwing 方式 的现象 1.截图效果(非百度网页):有图片,排版正常,但是部分样式丢失(输入框的文字掉下去了) 2.main 方法使用的里面没问题 ,但是springboot项目去启动以后,该方式触发报错 需要在启动类,关闭无头模式 3.本地项目成功实现以后 部署linux系统后,

    2024年02月13日
    浏览(35)
  • java通过http网络url下载文件

    上面代码报错,修改 URL url = new URL(fileUrl); ,使用 URL url = new URL(new URI(fileUrl).toASCIIString()); 原因: URL url = new URL(fileUrl); 和 URL url = new URL(new URI(fileUrl).toASCIIString()); 之间有一些微小的区别。 URL url = new URL(fileUrl);:这种方式直接使用 URL 类的构造函数创建一个 URL 对象。它假设

    2024年02月12日
    浏览(33)
  • Java URL自定义私有网络协议

    一.先来序言一段 我们习惯了http 我们也要习惯 当然,我们还要让URL习惯我们 如果不习惯,总会出现如下异常 在Android浏览器使用Ajax时也会不支持没有定义的过的协议。 二.协议的自定义的理解 协议:在编程的世界里,协议本身就是一套Input/ouput约束规则,因此,我们确切的

    2024年02月22日
    浏览(27)
  • java通过url获取视频时长(无需下载文件)

     1、导入架包 2、创建FFmpegFileInfo类(类的位置ws.schild.jave) 3、打包把类打成class文件放到本地的Maven仓库(如果在测试类中使用跳过此步)  4、测试

    2024年02月16日
    浏览(35)
  • 本地MinIO存储服务通过Java程序结合Cpolar内网穿透进行远程连接

    MinIO是一款高性能、分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等低成本机器也能够很好的运行MinIO。它的优点包括高性能、高可用性、易于部署和管理、支持多租户等。 Cpolar内网穿透提供了更高的安全性和隐私保护,通过使用加密通信通道,Cpolar技术可以

    2024年01月21日
    浏览(43)
  • java 通过远程URL实现文件下载几种方式

    java环境下通过远程接口实现文件下载几种方式: 使用NIO下载文件, 需要 jdk 1.7+ 利用 commonio 库下载文件,依赖Apache Common IO 文件通道FileChahhel 通过URL直接下载转换成MultipartFile 文件内容 保存地址 文件名称类型(后缀) 使用NIO下载文件 利用Apache common io 库下载文件 使用文件通

    2024年02月03日
    浏览(31)
  • java http请求url有空格,通过unicode方法处理

    在Java中,可以通过Unicode编码来处理URL中的空格等特殊字符,将其转换为%xx的形式。下面是一个处理示例: 以上代码中,我们使用了URLEncoder.encode()方法将URL中的特殊字符进行编码,并将所有的+替换为%20,表示空格的编码。使用时,只需要传入需要编码的URL即可,例如: 输出

    2024年02月12日
    浏览(32)
  • 【Java可执行命令】(十)JAR文件签名工具 jarsigner:通过数字签名及验证保证代码信任与安全,深入解析 Java的 jarsigner命令~

    jarsigner 是Java Development Kit (JDK) 提供的一个命令行工具,用于对JAR文件进行数字签名 。它的设计目的是提供身份验证和完整性保护,确保在分发和发布Java应用程序时的安全性。 数字签名是一种用于确认数据的来源和完整性的机制。使用私钥对数据进行签名,并使用公钥进行验

    2024年02月13日
    浏览(34)
  • Java实现文件上传到服务器本地,并通过url访问

    Java实现文件上传到服务器本地,并通过url访问 有个需求,前端上传文件,需要用开关的方式同时支持上传七牛和服务器本地,方便不同的用户需求合理分配资源。本篇主要介绍文件上传到本地,然后通过url访问。 首先想到的就是可以通过SpringBoot通常访问静态资源的方式,当

    2024年02月03日
    浏览(47)
  • 算法~totp用作签名防止url被复用

    之前写过关于totp的文章,对它的基础有不清楚的同学,可以先看我的这篇文章《TOTP基础一》《TOTP基础二》 因为totp是把时间分成了一个一个小的时间窗口,当生成totp的服务器和校验totp的服务器不在一起时间窗口,就会出现验证失败的问题,这是不可避免的,时间戳是一个

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包