Java 为带有空格的文件生成预签名的S3 URL

Java 为带有空格的文件生成预签名的S3 URL,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,我正在尝试生成一个预签名的URL链接以传递给客户端。只要文件不包含空格,我的逻辑就非常有效。但是,如果它确实存在,我会得到一个“指定的密钥不存在”错误 要明确的是,我正在获取URL本身并对其进行解析。所以,当我得到钥匙时,它看起来像这样: mybucket/my+file+with+spaces.pdf 因此,S3SDK似乎接受了这些优点,URL将它们编码为%2b,因此当单击链接时,它无法识别路径。如果重新写入链接并将“+”放回原处,则会出现以下错误: 我们计算的请求签名与您提供的签名不匹配。

我正在尝试生成一个预签名的URL链接以传递给客户端。只要文件不包含空格,我的逻辑就非常有效。但是,如果它确实存在,我会得到一个“指定的密钥不存在”错误

要明确的是,我正在获取URL本身并对其进行解析。所以,当我得到钥匙时,它看起来像这样:

mybucket/my+file+with+spaces.pdf
因此,S3SDK似乎接受了这些优点,URL将它们编码为%2b,因此当单击链接时,它无法识别路径。如果重新写入链接并将“+”放回原处,则会出现以下错误:

我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法


嗯,我找到了我自己问题的答案。如果您只是将+替换为“”,您将得到正确的结果

objectKey = file.replace("+", " ");

S3做了一些奇怪的URL编码,可能无法修复,因为它已经这样做了10年。您从哪里获得带有
+
符号的原始URL?我问,因为您的解决方案可能有效,但不完整。@Michael sqlbot感谢您的评论!我正在从另一个应用程序获取事件中的url。该应用程序将文档上传到kms加密的位置,并将事件传递给我。我提取文档链接并生成过期链接。你认为这有什么问题吗?你可能应该使用一个对url转义进行解码的库,并将通过该库获得的值传递给用户。如果文件名实际上包含一个文本
+
,则另一个应用程序应向您发送
%2B
,如果您将其传递给SDK,它将以
%252B
(将
%
转义为
%25
)的形式发送给S3,这也会被破坏,并且接收到的任何其他百分比编码文本也是如此。对接收到的值使用url解码应该将这些值转换回正常值,以便SDK可以使用规范化的值。这就是为什么我怀疑您的修复程序只修复了您迄今为止看到的一个问题。这是一个很棒的建议@Michael sqlbot!谢谢应该给你更多的时间,这样你才能回答@Michael sqlbot看起来我总是得到文件名中带有“+”的链接,所以用空格替换它们似乎是合理的。但是,如果这种情况发生变化,它可能会变得微妙。正在研究解决方案。。。