动态创建的s3文件夹未显示在listObjects中

时间:2018-02-26 00:51:29

标签: node.js amazon-s3 aws-sdk

我正在使用签名网址将我的反应应用程序中的文件上传到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的一部分,以使文件夹被识别为对象?

1 个答案:

答案 0 :(得分:0)

  

我将路径指定为我的密钥的一部分,并且正确创建了文件夹

实际上,他们不是。

规则1:控制台显示文件夹foo的文件夹图标,因为存储桶中存在一个或多个前缀为foo/的对象。

控制台似乎允许您创建“文件夹”,但这不是您执行此操作时发生的情况。如果在控制台中创建名为foo的文件夹,实际发生的是创建一个名为foo/的普通对象,长度为零字节。因为现在这意味着存储桶中至少存在一个前缀为foo/的对象,所以控制台中会显示一个文件夹(参见规则1)。

但该文件夹并不是真正的文件夹。它只是控制台与控制台另一个功能交互的一个功能。您实际上可以使用API​​ / SDK删除foo/对象,但没有任何反应,因为只要存储桶中至少有一个前缀为foo/的对象,控制台就会显示该文件夹。 (删除控制台中的文件夹会发送具有该前缀的所有对象的删除请求。通过API删除虚拟对象不会。)

简而言之,您正在观察的行为是正常的。

如果您将分隔符设置为/,那么listObjects响应将包含CommonPrefixes - 这就是您应该查看是否要查看“文件夹”的位置。以/结尾的对象只是控制台创建的虚拟对象。 CommonPrefixes不依赖于这些。