2016-04-21 104 views
0

我在Bluemix上使用swift对象存储来保存一些多媒体图像。我注意到SWIFT CLI工具有一个选项--prefix来将目录上传到对象存储。我知道Object store没有它的目录结构,但它通过在文件夹结构前加上文件名来保持层次结构。 CLI允许使用--prefix选项下载文件夹,并在下载时创建所需的目录结构。如何使用swift API在swift对象存储中上传目录结构

我正在寻找使用REST API实现的类似功能。在API文档中,我没有看到提供有关文件夹信息的任何方式。有谁知道如何使用API​​实现相同的行为?

感谢 马诺

回答

1

假设你的对象存储容器是https://host/AUTH_projectId/mycontainer访问,则可以在https://host/v1/AUTH_projectId/mycontainer/afolder/asubfolder/myfile.txt PUT一个文件来创建你正在寻找的层次:

curl -i https://host/v1/AUTH_projectId/mycontainer/afolder/asubfolder/myfile.txt -X PUT -H "Content-Length: 15" -H "Content-Type: " -H "X-Auth-Token: yourtoken" 

请参阅本OpenStack的API: http://developer.openstack.org/api-ref-objectstorage-v1.html#createOrReplaceObject

很明显,如果在下载过程中想要在本地重新创建文件夹层次结构,则由您来完成。

+0

注意,我们可以使用卷曲--upload文件选择本地文件进行上传。 – Fred

0

API本身在设计上不能支持通过目录上传,因为API纯粹是如何与服务对话的合同;它本身并不具备对本地目录结构的可见性。个人意志的工具,所以它实际上可能提供一个目录名相同的斯威夫特CLI工具:

swift upload mycontainer mylocaldir 

另一种API端的解决方案是斯威夫特的API中的批量上传API。我们在SoftLayer和Bluemix对​​象存储服务中启用了此功能。如果您能够将文件的tar/tar.gz/tar.bz2存档上传到API,则可以指示API在上传完成后自动将其提取到您的帐户或容器中。

下面是如何使用这个API的例子:

curl -i -X PUT -T stuff.tar.gz https://example.com/v1/AUTH_abc/container?extract-archive=tar.gz -H X-Auth-Token:mytoken 

为了包括对从文件中提取您的归档对象的前缀,你可以扩展上面的container位包括container/my/prefix。例如:

https://example.com/v1/AUTH_account/container/my/prefix?extract-archive=tar.gz 

如果你想存档到中抽出,使得在归档中的顶层文件夹成为容器,你会完全忽略container段。这将丢弃存档中的所有顶层文件,因此在创建存档时请确保所有文件都位于文件夹中。但你最终会得到一个URL是这样的:

https://example.com/v1/AUTH_account/?extract-archive=tar.gz 

注意,所支持的压缩格式有焦油,tar.gz的,和TAR.BZ2。

更多细节的OpenStack的斯威夫特文档中可用: http://docs.openstack.org/developer/swift/middleware.html#extract-archive