2012-02-02 134 views
0

我正在使用亞馬遜的AWS .NET SDK連接到亞馬遜的S3。AWS .NET SDK非法密鑰

PutObjectRequest的WithKey()方法自動編碼任何你在其上面扔的字符串,但是仍然有一些它無法處理的模式。不處理密鑰意味着拋出以下錯誤:

Amazon.S3.AmazonS3Exception: The request signature we calculated 
does not match the signature you provided 

我發現幾乎沒有關於來自亞馬遜的合法密鑰的文檔。在S3鍵中使用哪些模式是非法的並拋出此異常?

回答

3

,同時上傳到

private static string NormalizeKey(string relativePath) 
    { 
      return relativePath.Replace("~/", "").Replace(@"~\", "").Replace(@"\", @"/").Replace(@"//", @"/"); 
    } 

問候我已經創建了正常化鍵斜線的方法。

+1

謝謝鄰省!我有一個類似的方法來避免在構建密鑰時意外創建文件夾。什麼是用於替換呼叫的波浪線「〜」?沒有它似乎爲我工作得很好。在我的代碼中使用了 – 2012-02-04 13:10:29

+1

〜,因爲我已經設置了我的相對路徑,就像它們存在於我的本地項目中一樣。在你的情況下,這可以避免。 – 2012-02-06 07:20:55

1

在我的具體情況,這個問題是兩方面:

  1. 亞馬遜無法處理的按鍵反斜槓「\」字符
  2. 亞馬遜不允許文件夾在一段
結束

我寫了下面的兩種方法構建我的鑰匙時的幫助:

// Cleans a piece of a key - a folder name or final object name: 
// - replaces illegal characters with valid ones 
// - avoids accidental folder creation by removing slashes inside the key 
private string CleanPartialKey(string partialKey) 
{ 
    return partialKey.Replace('/', '-') // Add slashes separately - avoid creating accidental folders 
        .Replace('\\', '_'); // Amazon knows not how to deal with backslashes, so replace them with something else 
} 

// Ensures a full key does not have any illegal patterns. 
// This should only be called with a complete key 
private string CleanKey(string fullKey) 
{ 
    return fullKey.Replace("./", "/"); // ending a folder with a period is illegal 
}