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

如何使用 Amazons3的 boto库在 bucket 下创建文件夹?

我按照说明书的要求,使用权限、元数据等创建了密钥,但是在 boto 的文档中没有描述如何在 bucket 下创建文件夹,或者在 bucket 下创建文件夹。

173335 次浏览

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

将“ _ $file $”附加到您的文件夹名称并调用 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/

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

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

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

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

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

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

或者使用 控制台

显然,您现在可以在 S3中创建文件夹。我不知道从什么时候开始,但我有一个桶在“标准”区域,可以选择从行动创建文件夹下拉。

创建文件夹非常简单,实际上只是创建键。

你可以看到我下面的代码,我正在创建一个名为 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

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

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

用这个:

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

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)

尝试了上面的很多方法,在键名后面加上斜杠 /,创建目录对我来说不起作用:

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

为了创建目录,必须提供 Body参数:

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

资料来源: Ryantuck 在 Boto3期

这个问题与未来更相关,所以添加这个更新。 我正在使用上传 _ file 方法,如下所示。

fold ='/my/system/filePath/tabmcq/Tables/auto/18.tsv'
s3_client.upload_file(
Filename = full/file/path/filename.extension,
Bucket = "tab-mcq-de",
Key = f"{fold.split('/')[-3]}/{fold.split('/')[-2]}/{fold.split('/')[-1]}"
)

思想是“文件名”参数要求绝对文件路径的系统。 “ Key”参数需要来自文件所在源目录的相对文件路径

在本例中,Key 参数必须包含“ Tables/auto/18. tsv”值,以便客户端创建文件夹。

希望这个能帮上忙。