【问题标题】:List files changed after a particular timestamp in Google Cloud Storage Bucket列出在 Google Cloud Storage Bucket 中特定时间戳后更改的文件
【发布时间】:2019-06-29 11:53:33
【问题描述】:

我想列出在 node.js 中特定时间戳之后在 Google Cloud Storage Bucket 中更改/添加的文件。我正在浏览文档https://cloud.google.com/storage/docs/how-to,但没有找到任何机制。

const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
const bucketName = 'my-bucket';
const [files] = await storage.bucket(bucketName).getFiles();

如何列出存储桶中时间戳之后添加的文件?

【问题讨论】:

    标签: java node.js google-cloud-platform google-cloud-storage google-cloud-functions


    【解决方案1】:

    带前缀的 Python 版本

    import argparse
    
    from google.cloud import storage
    
    
    def list_blobs_with_prefix(bucket_name, prefix,tsAfter):
        storage_client = storage.Client()
    
        blobs = storage_client.list_blobs(bucket_name, prefix=prefix, delimiter=None)
    
        for blob in blobs:
            if blob.updated.timestamp() > int(tsAfter):
            print(blob.name, blob.updated)
    
    
    def main(bucket, prefix, tsAfter):
        list_blobs_with_prefix(bucket, prefix,tsAfter )
    
    
    if __name__ == '__main__':
        parser =argparse.ArgumentParser(description=__doc__,formatter_class=argparse.RawDescriptionHelpFormatter)
        parser.add_argument('bucket', help='Your Cloud Storage bucket.')
        parser.add_argument('prefix', help='Prefix to match')
        parser.add_argument('tsAfter', help='Timestamp After which you want to list the files.')
    
        args = parser.parse_args()
    
        main(args.bucket, args.prefix, args.tsAfter)
    

    【讨论】:

      【解决方案2】:

      对此没有直接的 API 支持。但是,如果您需要经常执行此查询,您可以手动构建工作流来保留索引。它将由一个小型应用程序组成,该应用程序存储一个订阅了有关存储桶更改通知的索引,并且它有一个 API 方法可以检索按日期排序的对象。

      【讨论】:

        【解决方案3】:

        正如 Doug Stevenson 指出的那样,没有直接的功能可以做到这一点,但是您实际上可以通过搜索文件的元数据来知道文件最后一次修改的时间。比如看这段代码sn -p:

        const {Storage} = require('@google-cloud/storage');
        const storage = new Storage();
        const bucketName = 'your-bucket-name';
        
        
        storage.bucket(bucketName).getFiles(function(err, files) {
          if (!err) {
            // files is an array of File objects.
                 files.forEach(function (file){
                        file.getMetadata(function (err, metadata){
                                // TODO: Save only the files before certain metadata.updated date
                                console.log("File named " + metadata.name +
                                            "last updated on: " + metadata.updated);
                        });
                 });
          }
        });
        

        然后由您在getMetadata 回调函数中创建一个条件,以仅在某个metadata.update 日期阈值之后列出/保留文件。

        【讨论】:

          【解决方案4】:

          对于给定的list API,这似乎是不可能的。文档没有说明使用日期过滤对象。

          在数据库中存储有关所有上传文件的数据是很常见的,这样更容易查询您想要存储的文件的任何属性。您甚至可以使用 Cloud Functions 触发器为每个文件上传自动将记录写入数据库。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-08
            • 2014-11-14
            • 1970-01-01
            • 1970-01-01
            • 2020-02-29
            • 2020-06-13
            相关资源
            最近更新 更多