Amazon web services S3生成签名URL时的URL编码

Amazon web services S3生成签名URL时的URL编码,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,我有一个系统,在将文件上传到S3之后,Lambda作业会引发一条队列消息,我使用它来维护MySQL表中的键列表 我正在尝试根据表中的记录生成预签名URL 我目前有两张唱片 /41jQnjTkg/thumbnail.jpg /41jQnjTkg/Artist+-+Song.mp3 使用以下命令生成预签名URL: var params = { Bucket: bucket, Expires: Settings.UrlGetTimeout, Key:

我有一个系统,在将文件上传到S3之后,Lambda作业会引发一条队列消息,我使用它来维护MySQL表中的键列表

我正在尝试根据表中的记录生成预签名URL

我目前有两张唱片

/41jQnjTkg/thumbnail.jpg
/41jQnjTkg/Artist+-+Song.mp3
使用以下命令生成预签名URL:

var params = {
        Bucket: bucket,
        Expires: Settings.UrlGetTimeout,
        Key: record
    };
S3.getSignedUrl('getObject', params);
带有
thumbnail.jpg
的URL工作得非常好,但是带有
+-+
的URL失败了。本地磁盘上的原始文件名是“Artist-Song.mp3”。S3将空格替换为“+”。现在,当我使用S3使用的完全相同的文件名生成URL时,它不起作用;我从S3得到一个“指定的密钥不存在”错误


我必须如何为所有文件名一致地生成URL?

第二个文件名即将出现。
+
实际上是一个空格,如果有其他字符(如括号),它们将被转义。在进一步处理数据之前,需要通过URL解码器运行数据


旁注:如果Lambda函数所做的唯一一件事就是创建一个SQS消息,那么您可以直接从S3中执行,而无需编写自己的函数。

我在做了一些实验后解决了这个问题

与直接存储S3在其S3事件消息中提供的密钥不同,我首先将“+”字符替换为空格(因为它们最初在磁盘上),然后对其进行URL解码

return decodeURIComponent(str.replace(/\+/img, " "));
现在,生成一个S3预签名URL的工作与预期的一样

MySQL之前有以下记录:

/41jQnjTkg/thumbnail.jpg
/41jQnjTkg/Artist+-+Song.mp3
现在:

我个人觉得S3的api/事件消息不一致

如果我直接使用S3本身在SQS事件消息中提供的密钥生成一个签名URL,它就不会工作了。必须对密钥执行这个字符串替换步骤&URL解码,以便使用它获得正确的工作URL


不确定这是设计还是错误。

是的,我应该更正我的问题。我使用S3事件生成了一条SQS消息,我正在我的应用程序中捕获并处理它。我也遇到了同样的问题。从S3事件获取SQS通知时,S3对象名称已编码,但符号url希望对其进行解码。
/41jQnjTkg/thumbnail.jpg
/41jQnjTkg/Artist - Song.mp3