2009-12-21 119 views
90

如何使用Amazon S3的boto庫在存儲桶下創建文件夾?亞馬遜S3博託 - 如何創建一個文件夾?

我遵循手冊,並創建了具有權限,元數據等的密鑰,但沒有在博託的文檔中介紹如何創建文件夾下的文件夾,或創建文件夾下的文件夾。

+0

似乎Amazon S3上沒有文件夾的概念,一些建議建立包含「文件夾/ test.txt的」名關鍵要解決它,我嘗試使用firefox s3插件來創建文件夾,並列出所有鍵在博託,它輸出文件夾我剛創建爲「<鍵:vitoshares,everyone_ $文件夾$>],所以如何查看/添加/修改內容到/從這個文件夾? – 2009-12-21 12:29:15

+0

注意:用於創建「文件夾」的AWS S3管理界面選項與S3FS不兼容,即使用界面創建「文件夾」並嘗試通過S3FS掛載點獲取所述文件夾的列表。 – jldupont 2013-02-17 12:49:58

+0

注2:通過S3FS創建「文件夾」與AWS S3管理界面兼容。 – jldupont 2013-02-17 12:52:52

回答

101

S3中沒有文件夾或目錄的概念。您可以創建像"abc/xys/uvw/123.jpg"這樣的文件名,許多S3訪問工具(如S3Fox)顯示爲一個目錄結構,但它實際上只是一個存儲桶中的單個文件。

+1

謝謝你的答案,所以我想如果我想看到一個特定文件夾的內容,我將需要遍歷許多其他不必要的文件? – 2010-01-27 23:50:43

+0

S3 API允許您爲存儲桶查詢具有給定前綴的鍵。所以你應該能夠構造一個只返回邏輯文件夾中的對象的請求。請參閱:http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev/index.html?ListingKeysHierarchy.html – 2010-07-22 19:58:31

+4

有非常明確的文件夾概念。答案是不正確的..請參閱下面的elranu答案。 – 2014-03-28 09:49:33

17

有了AWS SDK淨完美的作品,只要加入 「/」 的文件夾名稱字符串的結尾:

var folderKey = folderName + "/"; //end the folder name with "/" 
AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretKey); 
var request = new PutObjectRequest(); 
request.WithBucketName(AWSBucket); 
request.WithKey(folderKey); 
request.WithContentBody(string.Empty); 
S3Response response = client.PutObject(request); 

然後刷新您的AWS控制檯,你會看到文件夾

+0

建議的方式,只需使用AWS :: S3 ruby​​庫進行嘗試即可。它創建一個帶有空白文件名的文件的「文件夾」...所以它不會工作。穆罕默德阿斯加里的解決方案雖然工作正常! – Nico 2012-02-26 11:39:47

+0

@Nico,但是你是否用「/」結束了文件名,就像代碼註釋所說的那樣? – elranu 2012-02-26 15:01:00

+0

是的,我加了斜槓。我做了AWS :: S3 :: S3Object.store('test /','','my_bucket') – Nico 2012-03-19 17:20:39

1

S3沒有文件夾結構,但有一些稱爲鍵。

我們可以創建/2013/11/xyz.xls,並在控制檯中顯示爲文件夾。但S3的存儲部分將把它作爲文件名。

即使在檢索時,我們仍然可以使用ListObjects方法和Prefix參數查看特定文件夾(或多個鍵)中的文件。

33

假設你想創建Abc文件夾/ 123 /在你的水桶,這是一塊蛋糕與博託

k = bucket.new_key('abc/123/') 
k.set_contents_from_string('') 

或者使用console

+3

這是正確的答案。這可能與博託,這是你如何做到這一點。其實''new_key()'是你所需要的。發送給函數的字符串可以是'abc/123 /'或'abc/123/newfile.txt'。無論你喜歡什麼。在我嘗試獲得我希望的結果後,我喜歡在if語句中包裝它:'key = bucket.get_key(upgrade_path) 如果key爲None: key = bucket.new_key(upgrade_path)'基本上,if它不在那裏,創造它! – 2015-01-16 02:25:26

+0

使用最新的api,bucket.key('abc/123 /')也會達到相同的結果。 – light94 2015-05-15 10:03:47

+0

指定一個目錄密鑰也適用於上傳**分段上傳文件**'''mp = self._bucket。initiate_multipart_upload(bucket_key)''' – 2016-08-09 17:57:16

0

顯然,你可以在S3現在創建文件夾。我不知道從何時開始,但我在「標準」區域有一個存儲桶,並且可以選擇從操作下拉菜單中創建文件夾。

1

創建文件夾非常簡單。其實它只是創造鑰匙。

你可以看到我的下面的代碼,我正在創建一個名爲utc_time的文件夾。

清楚地記得結束與'/'像下面的關鍵,這表明它是一個關鍵:

重點= '文件夾1 /' + UTC_TIME + '/'

client = boto3.client('s3') 
utc_timestamp = time.time() 


def lambda_handler(event, context): 

    UTC_FORMAT = '%Y%m%d' 
    utc_time = datetime.datetime.utcfromtimestamp(utc_timestamp) 
    utc_time = utc_time.strftime(UTC_FORMAT) 
    print 'start to create folder for => ' + utc_time 

    putResponse = client.put_object(Bucket='mybucketName', 
            Key='folder1/' + utc_time + '/') 

    print putResponse 
0

雖然您可以通過將「/」附加到您的folder_name來創建一個文件夾。在引擎蓋下,S3不像普通的NFS那樣保持平坦的結構。

 
var params = { 
      Bucket : bucketName, 
      Key : folderName + "/" 
     }; 
s3.putObject(params, function (err, data) {}); 
0

使用此:

import boto3 
s3 = boto3.client('s3') 
bucket_name = "YOUR-BUCKET-NAME" 
directory_name = "DIRECTORY/THAT/YOU/WANT/TO/CREATE" #it's name of your folders 
s3.put_object(Bucket=bucket_name, Key=(directory_name+'/')) 
+0

感謝您的幫助,我得到了以下錯誤。你能幫我嗎.botocore.exceptions.NoCredentialsError:無法找到憑證 – Anvesh 2017-12-18 07:19:14

+0

你能分享你的代碼嗎? – 2017-12-18 07:59:03