2015-12-15 59 views
1

我有一個系統,在文件上傳到S3之後,Lambda作業產生一個隊列消息,我用它來維護MySQL表中的密鑰列表。S3生成簽名URL時的URL編碼

我想根據我的表中的記錄生成預先簽名的URL。

我有兩個記錄當前

/41jQnjTkg/thumbnail.jpg 
/41jQnjTkg/Artist+-+Song.mp3 

使用預先生成簽名網址:

var params = { 
     Bucket: bucket, 
     Expires: Settings.UrlGetTimeout, 
     Key: record 
    }; 
S3.getSignedUrl('getObject', params); 

thumbnail.jpg工作完全正常的URL,但一個與+-+失敗。本地磁盤上的原始文件名是「Artist - Song.mp3」。 S3用空格替換了'+'。現在,當我使用S3使用的完全相同的文件名生成URL時,它不起作用; S3出現「Specified Key does not exist」錯誤。

我必須做什麼才能爲所有文件名一致地生成URL?

回答

0

第二個文件的名字是form-urlencoded+實際上是一個空間,如果你有其他字符(如括號),他們將被百分比轉義。在進一步處理之前,您需要通過URL解碼器運行數據。請注意:如果您的Lambda函數所做的唯一一件事是創建一條SQS消息,那麼您可以直接從S3執行此操作,而無需編寫自己的函數。

+0

是的,我應該糾正我的問題。我使用S3事件來生成SQS消息,我正在捕獲應用程序和處理。 – Koder

0

我在一些實驗後解決了這個問題。

我不是直接存儲S3在其S3事件消息中提供的密鑰,而是首先用空格替換'+'字符(因爲它們最初在磁盤上),然後對其進行URL解碼。

return decodeURIComponent(str.replace(/\+/img, " ")); 

現在生成S3預先簽名的URL可以按預期工作。

的MySQL之前,有以下記錄:

/41jQnjTkg/thumbnail.jpg 
/41jQnjTkg/Artist+-+Song.mp3 

現在:

/41jQnjTkg/thumbnail.jpg 
/41jQnjTkg/Artist - Song.mp3 

我個人覺得有一個與S3的API /事件消息不一致。

如果我直接使用S3本身在SQS事件消息中提供的密鑰生成了一個簽名的URL,它將無法工作。必須執行此字符串替換步驟&對關鍵字進行URL解碼才能使用它來獲取正確的工作網址。

不確定這是設計還是錯誤。