我正在使用签名网址将我的反应应用程序中的文件上传到s3存储桶。我将路径指定为我的密钥的一部分,并正确创建文件夹:
let params = {
Bucket: vars.aws.bucket,
Key: `${req.body.path}/${req.body.fileName}`,
Expires: 5000,
ACL: 'public-read-write',
ContentType: req.body.fileType,
};
s3.getSignedUrl('putObject', params, (err, data)=>{...
但是,当我使用s3.listObject时,不会返回以这种方式创建的文件夹。这是我的节点api代码:
const getFiles = (req, res) => {
let params = {
s3Params:{
Bucket: vars.aws.bucket,
Delimiter: '',
Prefix: req.body.path
}
}
s3.listObjects(params.s3Params, function (err, data) {
if (err) {
res.status(401).json(err);
} else {
res.status(200).json(data);
}
});
}
通过门户网站创建的文件夹正确显示在返回的对象中。是否需要设置任何属性作为生成签名URL的一部分,以使文件夹被识别为对象?
答案 0 :(得分:0)
我将路径指定为我的密钥的一部分,并且正确创建了文件夹
实际上,他们不是。
规则1:控制台显示文件夹foo
的文件夹图标,因为存储桶中存在一个或多个前缀为foo/
的对象。
控制台似乎允许您创建“文件夹”,但这不是您执行此操作时发生的情况。如果在控制台中创建名为foo
的文件夹,实际发生的是创建一个名为foo/
的普通对象,长度为零字节。因为现在这意味着存储桶中至少存在一个前缀为foo/
的对象,所以控制台中会显示一个文件夹(参见规则1)。
但该文件夹并不是真正的文件夹。它只是控制台与控制台另一个功能交互的一个功能。您实际上可以使用API / SDK删除foo/
对象,但没有任何反应,因为只要存储桶中至少有一个前缀为foo/
的对象,控制台就会显示该文件夹。 (删除控制台中的文件夹会发送具有该前缀的所有对象的删除请求。通过API删除虚拟对象不会。)
简而言之,您正在观察的行为是正常的。
如果您将分隔符设置为/
,那么listObjects
响应将包含CommonPrefixes
- 这就是您应该查看是否要查看“文件夹”的位置。以/
结尾的对象只是控制台创建的虚拟对象。 CommonPrefixes
不依赖于这些。