Php AWS S3如何存储文件?(目录结构)

Php AWS S3如何存储文件?(目录结构),php,symfony,amazon-web-services,file-upload,amazon-s3,Php,Symfony,Amazon Web Services,File Upload,Amazon S3,我们正处于开发阶段。我们计划使用一个专用的基础设施,但将决定权转移到AWS云上 上传图像的目录结构实现如下: web_root\{year}\{month}\{day}{type}{filename\u md5\u hash}.jpeg 其中,小图像的类型为s,原始尺寸的类型为o。小图像是使用过滤器创建的 问题是,我听说AWSS3不能控制bucket中的目录结构 你无价的解释总是很有帮助的。谢谢AWS S3文档中介绍了这一点: 在AmazonS3中,bucket和对象是主要资源,对象存储在bu

我们正处于开发阶段。我们计划使用一个专用的基础设施,但将决定权转移到AWS云上

上传图像的目录结构实现如下:

web_root\{year}\{month}\{day}{type}{filename\u md5\u hash}.jpeg

其中,小图像的类型为
s
,原始尺寸的类型为
o
。小图像是使用过滤器创建的

问题是,我听说AWSS3不能控制bucket中的目录结构


你无价的解释总是很有帮助的。谢谢

AWS S3文档中介绍了这一点:

在AmazonS3中,bucket和对象是主要资源,对象存储在bucket中AmazonS3采用扁平结构,没有典型文件系统中的层次结构。但是,为了组织的简单性,AmazonS3控制台支持文件夹概念,作为对对象进行分组的一种方式。AmazonS3通过使用对象的键名前缀来实现这一点

例如,您可以在控制台中创建名为
photos
的文件夹,并在其中存储名为
myphoto.jpg
的对象。然后将对象存储为键名
photos/myphoto.jpg
,其中
photos/
是前缀

文件夹中可以有文件夹,但存储桶中不能有存储桶您可以将对象直接上载和复制到文件夹中。文件夹可以创建、删除和公开,但不能重命名。对象可以从一个文件夹移动到另一个文件夹

因此,您确实可以使用bucket中类似的文件夹结构将文件上载到S3:

http://{bucket}.{endpoint}.amazonaws.com/web_root/{year}/{month}/{day}/{type}{filename\u md5\u hash}.jpeg


http://{endpoint}.amazonaws.com/{bucket}/web_root/{year}/{month}/{day}/{type}{type}.jpeg

S3不是一个普通的文件系统,它本身没有文件结构,但它确实有对象引用的嵌套键,甚至有点假装它与API类似(您可以使用
aws s3 ls
列出一个bucket,然后在对象树中移动时使用它,就像使用文件系统一样)


因此,如果您想创建一个名为
foo\u ashdbasd.jpeg的对象,并且通常您希望它位于这样的文件夹结构中
web\u root\2016\06\15
,那么您只需在S3存储桶中写入一个名为
web\u root/2016/06/15/foo\u ashdbasd.jpeg的对象,您已经有了一些很好的答案,所以另一个问题需要解决这可能是多余的,但是S3的问题是文件夹是由对象键(=“path”)中的
/
模拟的API上的一个文件夹,只需在其名称中添加斜杠即可。无需创建文件夹,只要文件存在,它们就存在。可以在控制台中,或通过创建最后一个字符为
/
的空对象,但这是完全不必要的。没有真正的层次结构,因此没有性能限制考虑文件夹中文件的数量。玩一下。@Michael sqlbot,谢谢您的解释。您能详细说明原因吗?使用扁平结构是否有某种性能优势?