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

Posted

技术标签:

【中文标题】Amazon S3 boto - 如何创建文件夹?【英文标题】:Amazon S3 boto - how to create a folder? 【发布时间】:2010-12-28 17:24:57 【问题描述】:

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

我按照手册,创建了具有权限、元数据等的密钥,但在 boto 的文档中没有描述如何在存储桶下创建文件夹,或在存储桶中的文件夹下创建文件夹。

【问题讨论】:

亚马逊 s3 似乎没有文件夹的概念,有人建议创建名称为“folder/test.txt”的密钥来绕过它。我尝试使用 firefox s3 插件创建文件夹,并且列出 boto 中的所有键,它将我刚刚创建的文件夹输出为“],那么我如何查看/添加/修改该文件夹的内容? 注意:用于创建“文件夹”的 AWS S3 管理界面选项与 S3FS 不兼容,即使用该界面创建“文件夹”并尝试通过 S3FS 挂载点获取所述文件夹的列表。 注2:通过S3FS创建“文件夹”虽然兼容AWS S3管理界面。 请参阅下面的@JaHax 答案,了解如何使用 Boto 执行此操作的示例。简单! 【参考方案1】:

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

【讨论】:

感谢您的回答,所以我想如果我想查看特定文件夹的内容,我需要遍历许多其他不必要的文件? 文件夹的概念非常明确。答案不正确。请参阅下面的 elranu 答案。 @BoppityBop:S3没有文件夹的概念。 S3 没有文件夹,尽管 管理控制台 和许多工具确实用斜杠表示键。请参阅Working with Folders 并阅读以下部分:“因此,控制台使用对象键名称来显示文件夹和层次结构。 在 Amazon S3 中,您只有存储桶和对象。" 从技术上讲它可能不是一个文件夹,但似乎肯定有文件夹支持。在 aws 控制台中查看存储桶时,您可以单击“创建文件夹”,它将创建一个,它们可以为空,并从中提取元数据。 S3 是一个巨大的自定义 DynamoDB 键值存储。一些工具(包括 AWS Web 控制台)提供了一些模仿目录树的功能,但如果您的应用程序假设它等同于文件系统,那么您将使用 S3 而不是使用它。例如,重命名看似目录的内容需要扫描键空间并修改包含相关“目录名称”的每个键。另一方面,作为键值存储,不需要创建“父目录”或清理“空文件夹”,而这需要模仿文件系统【参考方案2】:

假设您想在存储桶中创建文件夹 abc/123/,这对 Boto 来说是小菜一碟

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

或使用console

【讨论】:

这是正确答案。 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) 本质上,如果它不存在,则创建它! 使用最新的api,bucket.key('abc/123/')也会达到同样的效果。 指定目录键也适用于在分段上传中上传文件mp = self._bucket.initiate_multipart_upload(bucket_key) 我猜这已经过时了,或者问题应该包括一些关于bucket 是什么的说明。这个方法new_key 似乎不再在boto3 中的任何S3 相关类中可用。【参考方案3】:

使用 AWS SDK .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 但您是否像代码注释所说的那样以“/”结尾文件名? 是的,我添加了斜线。我做了 AWS::S3::S3Object.store('test/', '', 'my_bucket') 使用空字符串和最后的斜杠发出“putObject”对我有用。我将 php 与 tpyo/amazon-s3-php-class 库一起使用。 @BoppityBop 是的,它有一个创建文件夹按钮,但这可能也只是产生某种空文件【参考方案4】:

使用这个:

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: Unable to locate credentials 您需要以某种方式指定您的 aws 凭证。看看这个:boto3.readthedocs.io/en/latest/guide/…【参考方案5】:

将“_$folder$”附加到您的文件夹名称并调用 put。

    String extension = "_$folder$";
    s3.putObject("MyBucket", "MyFolder"+ extension, new ByteArrayInputStream(new byte[0]), null);

见: http://www.snowgiraffe.com/tech/147/creating-folders-programmatically-with-amazon-s3s-api-putting-babies-in-buckets/

【讨论】:

这种创建文件夹的方式不再有效。您应该尝试@TomNg 建议的方式【参考方案6】:

尝试了上面的许多方法并将正斜杠 / 添加到密钥名称的末尾,创建目录对我不起作用:

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

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

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

来源:ryantuck in boto3 issue

【讨论】:

【参考方案7】:

创建文件夹真的很容易。实际上它只是创建键。

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

请记住以 '/' 结束键,如下所示,这表明它是一个键:

Key='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

【讨论】:

【参考方案8】:

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)

【讨论】:

【参考方案9】:

虽然您可以通过将“/”附加到您的文件夹名称来创建文件夹。在底层,与常规 NFS 不同,S3 保持扁平结构。

变量参数 = 桶:桶名, 键:文件夹名称+“/” ; s3.putObject(params, function (err, data) );

【讨论】:

【参考方案10】:

S3 没有文件夹结构,但是有一种叫做键的东西。

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

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

【讨论】:

【参考方案11】:

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

【讨论】:

以上是关于Amazon S3 boto - 如何创建文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 boto 将文件从 Amazon S3 流式传输到 Rackspace Cloudfiles?

使用 Amazon s3 boto 库,如何获取已保存密钥的 URL?

如何使 Pyspark 脚本在 Amazon EMR 上运行以识别 boto3 模块?它说找不到模块

如何使用 boto3 将 S3 对象保存到文件中

为啥没有准备好 Amazon S3 身份验证处理程序?

如何将抓取的数据从 Scrapy 以 csv 或 json 格式上传到 Amazon S3?