143

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

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

4

11 回答 11

153

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

于 2010-01-26T18:03:09.420 回答
55

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

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

或者使用控制台

于 2014-07-30T09:30:50.230 回答
22

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

于 2011-09-16T19:48:30.877 回答
22

用这个:

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+'/'))
于 2017-12-14T20:17:23.477 回答
7

将“_$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/

于 2011-05-24T12:27:24.593 回答
7

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

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

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

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

资料来源:ryantuck 在 boto3 问题中

于 2019-09-23T05:05:54.307 回答
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
于 2017-02-07T07:13:59.070 回答
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)
于 2019-03-21T04:02:25.193 回答
2

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

变量参数 = {
            桶:桶名,
            键:文件夹名称+“/”
        };
s3.putObject(params, function (err, data) {});
于 2017-08-20T16:39:07.100 回答
0

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

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

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

于 2013-11-15T23:06:39.473 回答
0

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

于 2015-10-21T09:44:04.850 回答