我想在我的Amazon S3存储桶中使用编码添加文件夹。 你能给我建议怎样实现这个目标吗?
Amazon S3中没有文件夹的概念,但是大多数可用的S3浏览器工具会将键名中被斜线分隔的部分显示为文件夹。
如果你确实需要文件夹的效果,可以创建一个以斜线结尾的空对象,例如"folder/"。在GUI工具和AWS控制台中打开它时,它看起来像一个文件夹。
正如其他人所说,在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
现在,这个命令有趣的地方是,你不需要在运行此命令之前创建所有的“文件夹”(对象)。这意味着你可以有一个“文件夹”(对象)来包含其他东西,然后你可以使用此命令在该“文件夹”(对象)中创建模拟的文件夹结构,就像我之前讨论过的那样。例如,我有一个名为“importer”的“文件夹”(对象)在我的S3存储桶中,假设我想将sample.txt插入到年、月和一个示例“文件夹”(对象)的目录结构中。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标志,不指定文件名,并在提供的路径末尾留下一个斜杠,系统将在不插入文件的情况下在S3存储桶中创建所需的模拟文件夹结构。
希望这可以帮助您更好地理解该系统。
注意:一旦您创建了“文件夹”结构,您可以使用S3的“sync”命令将后代“文件夹”与本地机器上的文件夹或甚至另一个S3存储桶同步。
s3
vs s3api
):https://dev59.com/k18d5IYBdhLWcg3w41gp#26396150。 对于许多任务来说,使用aws s3
可能更容易安装和使用,例如将本地pwd中的所有文件复制到远程:aws s3 sync . s3://my-bucket
。 - michaelaws s3api put-object --bucket my-bucket --key folder/
- Robert ChenJava和AWS SDK:
S3中没有文件夹,只有键/值对。 键可以包含斜杠(/
),这将使其在管理控制台中显示为文件夹,但在编程上它不是文件夹,而是一个字符串值。
如果您想构建S3存储桶的结构,则可以使用常规目录模式简单地命名约定(您给文件的键),例如 folder/subfolder/file.txt
。
当搜索时(取决于您使用的语言),您可以通过前缀和分隔符搜索。 在Java中,它将是一个 listObjects(String storageBucket, String prefix, String delimiter)
方法调用。
storageBucket
是您的存储桶名称,prefix
是您要搜索的键,delimiter
用于基于 prefix
过滤搜索结果。
AWS:S3 Rails宝石自己完成此操作:
AWS::S3::S3Object.store("teaser/images/troll.png", file, AWS_BUCKET)
teaser
和images
文件夹不存在,将自动创建它们。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 cp /path/to/folder s3://bucket/path/to/folder --recursive
您还可以使用aws s3 sync
选项来同步文件夹。
对于Swift,我创建了一个方法,您需要传递一个String
作为文件夹名称。
Swift 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
})
}
createFolderWith(Name:"newFolder")
-(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");
}
}];
}
以下是如何通过代码/cli来实现您要寻求的内容:
--create/select the file (locally) which you want to move to the folder:
~/Desktop> touch file_to_move
--move the file to s3 folder by executing:
~/Desktop> aws s3 cp file_to_move s3://<path_to_your_bucket>/<new_folder_name>/