如何通过Softlayer Swift对象存储API查询容器内文件夹是否存在?
解决OpenStack对象存储虚拟文件夹存在性检查问题
我来帮你搞定这个困扰——首先得明确一个核心点:OpenStack Swift(也就是你用的SoftLayer对象存储底层)是扁平结构,没有真正的「文件夹/目录」实体,所谓的文件夹完全是通过对象键的前缀(比如source/file.jpg)和分隔符/模拟出来的。这也是你之前的命令出问题的根本原因。
先分析下你试过的两个命令为啥没得到预期结果:
- 第一个命令
curl.exe -isS https://dal01.objectstorage.softlayer.net/v1/AUTH_d11/?container=JS&prefix=source&delimiter=/ ...返回204,是因为你的prefix=source没加末尾的/。Swift会匹配所有以source开头的对象(比如sourcetest.txt),但不会匹配source/file.txt这种以source/为前缀的对象,自然查不到你要的虚拟文件夹。 - 第二个命令访问
/JS/source返回404是正常的,因为这个路径对应的不是一个实际存在的对象——Swift只会识别具体的对象键,而虚拟文件夹本身不是一个对象,除非你手动创建了一个名为source/的空对象(有些管理门户会自动创建这个空对象来让文件夹显示更直观,但这不是必须的)。
正确的检查方法
执行以下curl命令来查询虚拟文件夹是否存在:
curl.exe -isS "https://dal01.objectstorage.softlayer.net/v1/AUTH_d11/JS?prefix=source/&delimiter=/" -H "X-Auth-Token: AUTH_tk70f74664fd"
这里做了两个关键调整:
- 把容器名
JS直接放在URL路径中(/v1/AUTH_d11/JS),这是Swift API更标准的写法。 - 将
prefix设置为source/(带末尾的斜杠),确保匹配所有以该虚拟文件夹为前缀的对象。
如何判断结果:
- 如果返回HTTP 200 OK,并且响应体中包含
subdir字段值为source/,或者列出了该文件夹下的对象/子文件夹,说明虚拟文件夹存在。 - 如果返回HTTP 204 No Content,说明没有任何对象以
source/为前缀,即该虚拟文件夹不存在。
补充说明
如果你希望通过直接请求路径的方式检查(比如模拟访问文件夹),可以手动创建一个名为source/的空对象:
curl.exe -X PUT "https://dal01.objectstorage.softlayer.net/v1/AUTH_d11/JS/source/" -H "X-Auth-Token: AUTH_tk70f74664fd" -H "Content-Length: 0"
之后再执行curl.exe -isS https://dal01.objectstorage.softlayer.net/v1/AUTH_d11/JS/source/ -H "X-Auth-Token: AUTH_tk70f74664fd"就会返回HTTP 200 OK,但这一步不是必须的,只是为了让路径可直接访问。
内容的提问来源于stack exchange,提问作者Monisha Chiber
相关产品推荐
相关产品推荐

