2009-12-21 79 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