2011-07-22 112 views

回答

37

有在Amazon S3中没有文件夹。只是大多数可用的S3浏览器工具都显示了斜杠分隔的部分密钥名称作为文件夹。

如果你真的需要,你可以在结束斜杠创建一个空的对象。例如“文件夹/”如果您使用GUI工具和AWS控制台打开它,它将看起来像一个文件夹。

+5

它看起来像我的文件夹? – Nate

+0

看这个http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html – lucasddaniel

3

有了AWS SDK净完美的作品,只要加入“/”这个名字的文件夹的结尾:

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控制台,你会看到该文件夹​​

9

AWS:S3轨宝石做到这一点本身:

AWS::S3::S3Object.store("teaser/images/troll.png", file, AWS_BUCKET) 

会自动创建teaserimages“文件夹”,如果他们不这样做已经存在。

16

与Java SDK AWS:

  1. 有在S3中没有文件夹,只有键/值对。该密钥可以包含斜线(/),并且会使其显示为管理控制台中的文件夹,但通过编程方式,它不是文件夹,而是字符串值。

  2. 如果您尝试构建s3存储桶,那么您的命名约定(您提供文件的密钥)可以简单地遵循正常的目录模式,即folder/subfolder/file.txt

    当搜索(具体取决于您使用的语言),您可以用分隔符通过前缀搜索。在Java中,这将是一个listObjects(String storageBucket, String prefix, String delimiter)方法调用。

    storageBucket是你斗的名称,prefix是你要搜索的关键,而delimiter用于搜索基于关闭prefix进行过滤。

12

正如大家都告诉过你的,在AWS S3中没有任何“文件夹”,你正在错误地考虑它们。 AWS S3具有“对象”,这些对象可以看起来像文件夹,但它们并不是真正意义上的文件夹。如果您在Amazon AWS S3上寻找创建文件夹,您将找不到很多好结​​果。

有创造意义上的“文件夹”,您可以创建在S3模拟的文件夹结构,但同样,各地正在创建的S3对象,而不是文件夹中的事实,包你的头的方式。与此同时,您将需要命令“put-object”来创建此模拟文件夹结构。现在,为了使用此命令,您需要安装AWS CLI工具,请参阅AWS CLI Installation以获取安装指示信息。

的命令是这样的:

aws s3api put-object --bucket your-bucket-name --key path/to/file/yourfile.txt --body yourfile.txt 

现在,关于这个命令的最有趣的部分是,你并不需要把所有创建的“文件夹”(对象)的运行此命令之前。这意味着你可以有一个“文件夹”(对象)来包含事物,但是你可以使用这个命令在前面讨论过的“文件夹”(对象)中创建模拟的文件夹结构。例如,我在我的S3存储桶中有一个名为“importer”的“文件夹”(对象),可以说我想将sample.txt插入年份,月份的“文件夹”(对象)结构中,然后将样本“文件夹“(对象)。

如果我的bucket中只有“importer”对象,那么在运行此命令之前,我不需要事先创建年份,月份和示例对象(“文件夹”)。我可以像这样运行此命令:

aws s3api put-object --bucket my-bucket-here --key importer/2016/01/sample/sample.txt --body sample.txt 

put-object命令将进入并创建我在--key标志中指定的路径。这是一个宝贝:即使你没有文件上传到S3,你仍然可以在S3存储桶中创建对象(“文件夹”),例如,我创建了一个shell脚本来“创建文件夹”在桶中,通过放弃--body标志,并且不指定文件名,并在--key标志中提供的路径末尾留下斜线,系统会在S3存储桶内创建所需的模拟文件夹结构而不在过程中插入文件。

希望这可以帮助您更好地了解系统。注意:一旦创建了“文件夹”结构,您可以使用S3的“同步”命令将后代“文件夹”与本地计算机上的文件夹或甚至另一个S3存储桶同步。

+0

我意识到这个问题已经死了一段时间,但我从来没有发现一个满意的答复过这个问题我自己,我只是碰巧遇到了正确的术语,我玩了一些shell脚本,直到我找出如何做到这一点。所以我想给任何需要知道如何做到这一点的人一个真正的答案。 – Jravict

+0

相关的(对于那些想了解一下各种可用的S3 CLI,例如,.'s3' VS's3api'):https://stackoverflow.com/a/26396150/127971使用'AWS s3'可能会更容易,虽然安装和用于许多任务,例如,将本地pwd中的所有文件复制到远程:'aws s3 sync。 S3://我斗'加最后的斜线,并留下脱去了身上的 – michael

+0

CLI例如:'AWS s3api把对象--bucket我斗--key文件夹/' –

0

您可以从可用AWS SDK

选择您所选择的语言或者你可以尝试在现有minio客户端库PythonGo.NetJavaJavascript为您的应用程序开发环境,它例如与所有的基本操作指南上市。

声明:我工作了Minio

+0

可悲的是,你的例子不包括创建文件夹作为放置对象的一部分的示例... –

5

在iOS系统(Objective-C的),我也按以下方式

您可以添加以下代码以编程方式创建Amazon S3的桶里面的文件夹。这是工作代码片段。任何建议欢迎。

-(void)createFolder{ 
    AWSS3PutObjectRequest *awsS3PutObjectRequest = [AWSS3PutObjectRequest new]; 
    awsS3PutObjectRequest.key = [NSString stringWithFormat:@"%@/", @"FolderName"]; 
    awsS3PutObjectRequest.bucket = @"Bucket_Name"; 
    AWSS3 *awsS3 = [AWSS3 defaultS3]; 
    [awsS3 putObject:awsS3PutObjectRequest completionHandler:^(AWSS3PutObjectOutput * _Nullable response, NSError * _Nullable error) { 
     if (error) { 
      NSLog(@"error Creating folder"); 
     }else{ 
      NSLog(@"Folder Creating Sucessful"); 
     } 
    }]; 
} 
+0

除了代码之外,还有一些解释会使此答案更有用。 @yogesh Dalavi这个代码可以用于 –

+0

。 –

2

对于斯威夫特,我创建,你在String通过文件夹名称的方法。

斯威夫特3:

import AWSS3 

func createFolderWith(Name: String!) { 
    let folderRequest: AWSS3PutObjectRequest = AWSS3PutObjectRequest() 
    folderRequest.key = Name + "/" 
    folderRequest.bucket = bucket 
    AWSS3.default().putObject(folderRequest).continue({ (task) -> Any? in 
     if task.error != nil { 
      assertionFailure("* * * error: \(task.error?.localizedDescription)") 
     } else { 
      print("created \(Name) folder") 
     } 
     return nil 
    }) 
} 

然后,只需使用

func createFolderWith(Name: String!) { 
    let folderRequest: AWSS3PutObjectRequest = AWSS3PutObjectRequest() 
    folderRequest.key = Name + "/" 
    folderRequest.bucket = "Your Bucket Name" 
    AWSS3.defaultS3().putObject(folderRequest).continueWithBlock({ (task) -> AnyObject? in 
     if task.error != nil { 
      assertionFailure("* * * error: \(task.error?.localizedDescription)") 
     } else { 
      print("created \(Name) folder") 
     } 
     return nil 
    }) 
} 
0

在SWIFT 2.2,您可以创建文件夹,也可以复制整个文件夹到一个存储桶。

aws s3 cp /path/to/folder s3://bucket/path/to/folder --recursive 

也有选项同步使用aws s3 sync

0

一个文件夹下创建一个名为“mydir1”一个空目录。

下面是代码的NodeJS,它应该是对其他语言类似。

诀窍是具有在对象的名称的末尾斜杠(/),如在“mydir1 /”,否则一个名为“mydir1”将被创建的文件。

let AWS = require('aws-sdk'); 
AWS.config.loadFromPath(__dirname + '\\my-aws-config.json'); 
let s3 = new AWS.S3(); 

var params = { 
    Bucket: "mybucket1", 
    Key: "mydir1/", 
    ServerSideEncryption: "AES256" }; 

s3.putObject(params, function (err, data) { 
    if (err) { 
     console.log(err, err.stack); // an error occurred 
     return; 
    } else { 
     console.log(data);   // successful response 
     return; 
     /* 
     data = { 
     ETag: "\"6805f2cfc46c0f04559748bb039d69ae\"", 
     ServerSideEncryption: "AES256", 
     VersionId: "Ri.vC6qVlA4dEnjgRV4ZHsHoFIjqEMNt" 
     } 
     */ 
    } }); 

来源:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property