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 中的所有键,它将我刚刚创建的文件夹输出为“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?