2014-04-15 57 views
3

我試圖通過.Net/C#訪問Amazon S3 API上的外部存儲桶。Amazon S3 API .Net C# - 訪問外部存儲桶

我已經嘗試登錄第三方工具,它的工作就像一個魅力,現在我想要獲得框架內的桶的項目。我在Proxy後面使用這個,這就是我使用S3config的原因。

AmazonS3Config S3Config = new AmazonS3Config() 
         { 
          CommunicationProtocol = Protocol.HTTP, 
          ProxyHost = Proxy.Host, 
          ProxyPort = Convert.ToInt32(Proxy.Port), 
          ProxyCredentials = new NetworkCredential 
               { 
                UserName = Proxy.User, 
                Password = Proxy.Password 
               } 
         }; 
AmazonS3 S3Client = Amazon.AWSClientFactory.CreateAmazonS3Client(AccessKey, SecretKey,S3Config); 

這就是我建立連接本身到亞馬遜的方式。我也已經嘗試過將

ServiceURL = "s3.amazonaws.com", 

到配置的對象初始化,因爲我在歐盟和剷鬥位於美國的某個地方。

當我現在可以通過嘗試訪問:

ListObjectsRequest req = new ListObjectsRequest { BucketName = "yelp-syndication" }; 
ListObjectsResponse resp = S3Client.ListObjects(req); 

AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKeyID, secretAccessKeyID); 
return client.ListBuckets().Buckets.Where(b => b.BucketName == bucket).Single(); 

ListObjectsRequest Request = new ListObjectsRequest 
          { 
          BucketName = BucketName 
          }; 
ListObjectsResponse Response = S3Client.ListObjects(Request); 

我只得到Access denied在拋出Error對象。 我使用的憑據與第三方工具中的100%相同。

我在這裏錯過了什麼嗎?我是否需要使用任何我找不到的特殊方式來使其工作?

工作的Python片段是:

from boto.s3.connection import S3Connection 
conn = S3Connection(<ACCESS_KEY_ID>, <SECRET_ACCESS_KEY) 
bucket = conn.get_bucket(<BucketName>, validate=False) 

這將返回正確的結果,所以實際的連接工程,也是憑據。

+0

我有同樣的問題,你的服務URL需要HTTP或HTTPS。爲我工作。這個文檔在其錯誤的意義上很差。 IMO –

+0

我已經嘗試過了,如果我向配置文件的serviceurl中添加http://然後詢問listobjects,它實際上詢問:http:// bucketnamehttp://s3.amazonaws.com並失敗,因爲這很明顯無效。 – makuro

回答

1

使用給定的答案,作爲一個新的研究基地後,我想通了,我得給一個serviceURL中,一個regionendpoint併爲S3Config類的一側communicationprotocol和,因爲我知道確切的存儲桶中文件的名稱,我需要使用getobject而不是訪問存儲桶。

,這樣讓我工作的代碼是:

  AmazonS3Config S3Config = new AmazonS3Config 
            { 
             ServiceURL = "s3.amazonaws.com", 
             RegionEndpoint = RegionEndpoint.USWest2, 
             CommunicationProtocol = Protocol.HTTPS, 
             ProxyHost = Proxy.Host, 
             ProxyPort = Convert.ToInt32(Proxy.Port), 
             ProxyCredentials = new NetworkCredential 
                 { 
                  UserName = Proxy.User, 
                  Password = Proxy.Password 
                 } 
            }; 
     _S3Client = AWSClientFactory.CreateAmazonS3Client(AccessKey, SecretKey, S3Config); 
     _ObjRequest = new GetObjectRequest 
             { 
              BucketName = BucketName, 
              Key = Key 
             }; 
     _ObjResponse = _S3Client.GetObject(_ObjRequest); 
     return (_ObjResponse != null); 
1

這是我用來返回我的存儲桶中「目錄」中的文件列表的代碼,我知道它確實可行。我說目錄,但實際上並沒有這樣的事情。我對S3的理解是每個文件/文件夾都是一個對象。每個對象都有一個鍵。鍵確定樹中的哪個位置將顯示文件夾或文件。我相信一個關鍵的Folder1將是一個名爲Folder1的文件夾。具有密鑰Folder1/File1.txt的對象將是Folder1中的文件。

如果其他聰明人有更多的話要說或更正,我相信他們會告訴我。但是,代碼確實有效。

public List<string> ListFilesIn(string folder) 
    { 
     //I get my values from Orchard CMS but as long as your credentials are correct and can access the bucket this should work a dream. 
     var settings = new {S3ServiceUrl = "", S3SecretKey="", S3KeyId = "", S3BucketName = ""} 

     var amazonS3Config = new AmazonS3Config 
     { 
      ServiceURL = string.Format("https://{0}", settings.S3ServiceUrl) 
     }; 

     folder += folder.Substring(folder.Length - 1, 1) == "/" ? "" : "/"; 

     using (var amazonS3Client = new AmazonS3Client(settings.S3KeyId, 
     settings.S3SecretKey, 
     amazonS3Config)) 
     { 

      var response = amazonS3Client.ListObjects(new ListObjectsRequest 
      { 
       BucketName = settings.S3BucketName, 
       Prefix = folder 
      }); 

      if (response.S3Objects.Count() > 0) 
      { 
       return response.S3Objects.Select(s => s.Key).Where(w=>w != folder).ToList(); 
      } 
      else 
      { 
       return new List<string>(); 
      } 
     } 
    } 
+0

另外,因爲它是基於密鑰的,所有內容都區分大小寫。 –