2016-09-17 160 views
-1

我试图生成一个预先签名的URL链接以传递给客户端。只要文件不包含空格,我的逻辑就可以很好地工作。但是,如果它出现,我会得到一个“指定的密钥不存在”。错误。生成带空格的文件的预签名S3 URL

要清楚,我正在使用URL本身并解析它。所以,关键是这个样子,当我得到它:

mybucket/my+file+with+spaces.pdf 

因此,S3 SDK似乎采取的长处和他们URL编码为%2B所以当链接被点击它不承认路径。如果我重新写回链接把'+'放回去,我得到以下错误:

The request signature we calculated does not match the signature you provided. Check your key and signing method.

回答

0

嗯,我找到了我自己的问题的答案。如果你只用+替换+,你会得到正确的结果。

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

S3做了一些古怪的网址编码,可能无法修复,因为它已经有10年的历史了。你在哪里得到那个带有“+”符号的原始网址?我问,因为你的解决方案可能工作但不完整。 –

+0

@ Michael-sqlbot感谢您的评论!我从另一个应用程序获取事件中的url。该应用程序将文档上传到kms加密位置并将事件传递给我。我提取文档链接并生成到期链接。你看到有什么问题吗? – RockyMountainHigh

+2

你应该使用一个库来解码url转义并传递你在那里得到的值。如果文件名实际上包含一个文字'+',另一个应用程序应该向您发送'%2B',如果您将其传递给SDK,它将以'%252B'的形式发送给S3(将'%'转义为' 25'),这也被破坏了,并且接收到的任何其他百分比编码的文字也是如此。对接收到的值使用url解码应该将它们转换回正常状态,以便SDK具有标准化值以便处理。这就是为什么我怀疑你的修复只能修复你迄今为止看到的一个问题。 –