如何使用boto库在Amazon s3中创建存储桶下的文件夹?
我按照手册创建了密钥、权限和元数据等,但是在boto的文档中没有描述如何在存储桶中创建文件夹,或在存储桶的文件夹下创建文件夹。
如何使用boto库在Amazon s3中创建存储桶下的文件夹?
我按照手册创建了密钥、权限和元数据等,但是在boto的文档中没有描述如何在存储桶中创建文件夹,或在存储桶的文件夹下创建文件夹。
S3中没有文件夹或目录的概念。您可以创建像"abc/xys/uvw/123.jpg"
这样的文件名,许多S3访问工具(如S3Fox
)会将其显示为目录结构,但实际上它只是存储于桶中的单个文件。
假设您想要在您的存储桶中创建文件夹abc/123/,使用Boto很容易实现
k = bucket.new_key('abc/123/')
k.set_contents_from_string('')
或者使用控制台
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.thompsymp = self._bucket.initiate_multipart_upload(bucket_key)
- storm_m2138boto3
中,似乎没有任何与S3相关的类中提供new_key
方法。请注意,此方法已不再可用。 - Victor Schröder使用这个:
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+'/'))
使用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控制台,您将看到该文件夹
我尝试了上述多种方法并在键名末尾添加正斜杠/
来创建目录,但对我来说都没有起作用:
client.put_object(Bucket="foo-bucket", Key="test-folder/")
你需要提供 Body
参数才能创建目录:client.put_object(Bucket='foo-bucket',Body='', Key='test-folder/')
String extension = "_$folder$";
s3.putObject("MyBucket", "MyFolder"+ extension, new ByteArrayInputStream(new byte[0]), null);
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)
创建文件夹非常容易。实际上,只需创建键。
你可以看到我下面的代码,我正在创建一个以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
虽然你可以通过在文件夹名称后添加“/”来创建文件夹。但是,在底层,S3维护的是平面结构,而不是常规NFS。
var params = { Bucket : bucketName, Key : folderName + "/" }; s3.putObject(params, function (err, data) {});
以下代码使用Python的boto3库实现
s3 = boto3.client("s3")
s3.put_object(Bucket="dest_bucket", Key='folder_name/')