我正在使用 s3cmd 编写用于上传文件夹的 PHP 脚本,如果在 amazon S3 存储桶中找不到。首先,我需要获取所有文件夹名称并将其存储在数组中,然后使用array_search检查数组是否存在文件夹名称并继续下一步。
我在PHP中使用了get_object_list和list_objects,两者都不会只返回文件夹名称。所以我想知道有什么办法可以做到.
Amazon S3 使用的是"平面"存储系统。它实际上不支持文件夹/子目录。相反,子目录路径存储为文件名的一部分,称为"密钥"。
例如,存储在名为 bar
的文件夹中的foo.txt
实际上会创建一个键名为 bar/foo.txt
的对象。检索对象时,它看起来好像在 bar 目录中,但实际上并非如此。
S3 确实支持检索通用前缀列表的功能,该列表实际上是目录列表,但不能保证此类前缀始终存在,尤其是对于空目录。
与其编写脚本来"如果未找到则上传文件夹",不如查看 AWS 命令行界面 (CLI)。它包括一个命令aws s3 sync
,可以在位置之间自动复制文件,包括仅复制新文件或修改的文件。这可能完全避免了您编写自己的脚本的需要。
Amazon S3 是一个具有平面命名空间的云/对象存储。Amazon S3 上没有文件夹或目录的概念。你所拥有的是一个key
及其CommonPrefixes
为了获得类似的POSIX感觉,可以使用ListObjects()和特殊的分隔符来为文件系统浏览提供模拟。
https://github.com/minio/mc 就是为了这样的目的而构建的,你想要的在mc
中很容易做到。
以下是有关如何查看其工作的示例方法。 mc
具有进度条、会话管理、脚本友好的--json
输出等等。
$ mc --json ls https://s3.amazonaws.com/miniocloud | jq 'if .type == "folder" then .name else empty end'
"G/"
"Go/"
"asdfasdfadsf/"
"bin/"
"ema/"
"emacs/"
"new/"
"te1231231231231231231231/"
"test/"