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

vit*_*ang 114 amazon-s3 boto

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

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

小智 126

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

  • @BoppityBop:**3.1**中没有文件夹**的概念.S3没有文件夹,即使*管理控制台*和许多工具确实用斜杠表示键.请参阅[使用文件夹](http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html)并阅读以下部分:*"因此,控制台使用对象键名称来显示文件夹和层次结构.****在Amazon S3中,您只有桶和对象.**"* (17认同)
  • 有很好的文件夹概念.答案是不正确的..请参阅下面的elranu答案. (7认同)
  • 它在技术上可能不是一个文件夹,但肯定有文件夹支持.在aws控制台中查看存储桶时,您可以单击"创建文件夹",它将生成一个,它们可以为空,并从中提取元数据. (5认同)
  • S3是一个巨大的自定义DynamoDB键值存储.某些工具(包括AWS Web控制台)提供了一些模仿目录树的功能,但如果您的应用程序认为它等同于文件系统,那么您将使用S3而不是使用它.例如,重命名似乎是目录的内容需要扫描密钥空间并修改包含所讨论的"目录名称"的每个密钥.另一方面,作为键值存储,不需要创建"父目录"或清除"空文件夹",这模仿文件系统需要 (4认同)

Tom*_*mNg 47

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

k = bucket.new_key('abc/123/')
k.set_contents_from_string('')
Run Code Online (Sandbox Code Playgroud)

或者使用控制台

  • 这是正确的答案.Boto有可能,你就是这样做的.实际上`new_key()`就是你所需要的.发送给函数的字符串可以是`abc/123 /`或`abc/123/newfile.txt`.无论你喜欢什么.在我尝试获得我希望的内容之后,我喜欢将其包装在if语句中:`key = bucket.get_key(upgrade_path)如果key为None:key = bucket.new_key(upgrade_path)`基本上,如果是没有,创造它! (7认同)
  • 我猜这现在已经过时了,或者问题应该包括一些关于“bucket”是什么的说明。这个方法“new_key”似乎在“boto3”中任何与S3相关的类中都不再可用。 (7认同)
  • 使用最新的api,bucket.key('abc/123/')也会达到同样的效果。 (2认同)

elr*_*anu 19

使用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);
Run Code Online (Sandbox Code Playgroud)

然后刷新AWS控制台,您将看到该文件夹

  • @BoppityBop是的,它有一个创建文件夹按钮,但这可能只是制作某种空文件 (2认同)

Rez*_*mya 9

用这个:

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+'/'))
Run Code Online (Sandbox Code Playgroud)


小智 7

将"_ $ folder $"附加到您的文件夹名称并调用put.

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

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


小智 5

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)
Run Code Online (Sandbox Code Playgroud)


azz*_*msa 5

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

client.put_object(Bucket="foo-bucket", Key="test-folder/")
Run Code Online (Sandbox Code Playgroud)

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

client.put_object(Bucket='foo-bucket',Body='', Key='test-folder/')
Run Code Online (Sandbox Code Playgroud)

来源:ryantuck 在 boto3 问题