Amazon S3 Boto-如何创建文件夹?


123

如何使用botoAmazon s3的库在存储桶下创建文件夹?

我按照手册进行操作,并使用许可权,元数据等创建了密钥,但在boto文档中没有描述如何在存储桶下创建文件夹或在存储桶下的文件夹下创建文件夹的内容。


亚马逊s3似乎没有文件夹的概念,有人建议使用“ folder / test.txt”之类的名称创建密钥来解决它。我尝试使用firefox s3插件创建文件夹,并在boto中列出所有密钥,然后输出我刚刚创建的文件夹为“ <键:vitoshares,所有人_ $文件夹$>],那么如何查看/添加/修改此文件夹中的内容?
vito huang

注意:用于创建“文件夹”的AWS S3管理界面选项与S3FS不兼容,即使用该界面创建“文件夹”并尝试通过S3FS挂载点获取该文件夹的列表。
jldupont

注2:通过S3FS创建“文件夹”与AWS S3管理界面兼容。
jldupont

有关如何使用Boto执行此操作的示例,请参见下面的@JaHax答案。简单!
e.thompsy

Answers:


134

S3中没有文件夹或目录的概念。您可以创建像这样的文件名"abc/xys/uvw/123.jpg",许多S3访问工具都可以像S3Fox目录结构那样显示文件名,但实际上它只是存储桶中的单个文件。


1
感谢您的回答,所以我想如果我想查看特定文件夹的内容,我将需要遍历许多其他不必要的文件吗?
vito huang

7
文件夹的定义非常明确。答案不正确..请参阅下面的elranu答案。
Boppity Bop 2014年

19
@BoppityBop:有没有文件夹的概念S3。即使管理控制台和许多工具确实使用斜杠来表示键,S3也没有文件夹。请参阅使用文件夹并阅读以下部分:“因此控制台使用对象键名来显示文件夹和层次结构。 在Amazon S3中,您只有存储桶和对象。
Antti Haapala 2014年

7
从技术上讲,它可能不是文件夹,但肯定有文件夹支持。在aws控制台中,查看存储桶时,可以单击“创建文件夹”,它将创建一个,它们可以为空,并从其中提取元数据。
phazei 2015年

4
S3是巨大的自定义DynamoDB键值存储。某些工具(包括AWS Web控制台)提供了一些模仿目录树的功能,但是如果您的应用程序假定它等同于文件系统,则您将使用S3,而不是使用它。例如,重命名看似目录的文件需要扫描键空间并修改每个包含所涉及“目录名称”的键。另一方面,作为键值存储,无需创建“父目录”或清理“空文件夹”,而模仿文件系统则需
要这样做

51

假设您要在存储桶中创建文件夹abc / 123 /,这与Boto一样容易

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

或使用控制台


7
这是正确的答案。Boto可以实现,这就是您的操作方式。实际上,这new_key()就是您所需要的。发送给该函数的字符串可以是abc/123/abc/123/newfile.txt。无论您喜欢什么。在尝试获得希望的结果之后,我喜欢将其包装在if语句中:key = bucket.get_key(upgrade_path) if key is None: key = bucket.new_key(upgrade_path)本质上,如果不存在,请创建它!
e.thompsy 2015年

1
使用最新的api,bucket.key('abc / 123 /')也将获得相同的结果。
light94

指定目录密钥也可用于分段 上传中的文件上传mp = self._bucket.initiate_multipart_upload(bucket_key)
storm_m2138 '16

20

使用AWS开发工具包.Net可以完美运行,只需在文件夹名称字符串的末尾添加“ /”即可:

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控制台,您将看到该文件夹


刚刚尝试使用AWS :: S3 ruby​​库。它会创建一个“文件夹”,其中包含一个空白文件名的文件...因此它实际上并不起作用。Mohammad Asgari的解决方案效果很好!
Nico 2012年

@Nico,但您是否以文件名结尾“ /”,就像代码注释中指出的那样?
elranu 2012年

是的,我添加了斜线。我做了AWS :: S3 :: S3Object.store('test /','','my_bucket')
Nico

最后使用空字符串和斜杠发出“ putObject”对我有用。我正在将PHP与tpyo / amazon-s3-php-class库一起使用。
MikeMurko 2013年

2
@BoppityBop是的,它有一个“创建文件夹”按钮,但这也可能只会产生某种空文件
jamylak 2015年

15

用这个:

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+'/'))

感谢您的帮助,我遇到了错误。您能帮我吗.botocore.exceptions.NoCredentialsError:无法找到凭证
Anvesh

1
您需要以某种方式指定您的AWS凭证。检查了这一点: boto3.readthedocs.io/en/latest/guide/...
迪派通用汽车

谢谢!这对我来说非常好
:)


4

创建文件夹真的很容易。实际上,它只是在创建密钥。

您可以看到以下代码,我正在创建一个以utc_time为名称的文件夹。

请记住,如下所示以'/'结尾该键,这表明它是键:

键='folder1 /'+ 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

4

2019年更新,如果要创建路径为bucket_name / folder1 / folder2的文件夹,则可以使用以下代码:

from boto3 import client, resource

class S3Helper:

  def __init__(self):
      self.client = client("s3")
      self.s3 = resource('s3')

  def create_folder(self, path):
      path_arr = path.rstrip("/").split("/")
      if len(path_arr) == 1:
          return self.client.create_bucket(Bucket=path_arr[0])
      parent = path_arr[0]
      bucket = self.s3.Bucket(parent)
      status = bucket.put_object(Key="/".join(path_arr[1:]) + "/")
      return status

s3 = S3Helper()
s3.create_folder("bucket_name/folder1/folder2)

1

尽管您可以通过在文件夹名后添加“ /”来创建文件夹。在幕后,S3与常规NFS不同,保持平坦的结构。

var params = {
            桶:bucketName,
            键:folderName +“ /”
        };
s3.putObject(params,function(err,data){});

1

尝试了多种方法,并/在键名的末尾添加了正斜杠,以创建目录对我不起作用:

client.put_object(Bucket="foo-bucket", Key="test-folder/")

您必须提供Body参数才能创建目录:

client.put_object(Bucket='foo-bucket',Body='', Key='test-folder/')

来源:ryantuck在boto3问题中


0

S3没有文件夹结构,但是有一些称为键的东西。

我们可以创建/2013/11/xyz.xls并在控制台中将其显示为文件夹。但是S3的存储部分会将其作为文件名。

即使在检索时,我们也观察到通过使用ListObjects方法和Prefix参数可以看到特定文件夹(或键)中的文件。


0

显然,您现在可以在S3中创建文件夹。我不确定从什么时候开始,但是我在“标准”区域中有一个存储桶,可以从“操作”下拉菜单中选择“创建文件夹”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.