如何在GCP Cloud Storage中列出非文件夹类型的对象?
在GCP Cloud Storage Go SDK中仅列出文件对象
GCP Cloud Storage本身没有真正的文件夹概念,你看到的“文件夹”本质是名称以/结尾的零大小对象(通常是手动创建的)。针对你的需求,以下是可行的解决方案:
方案1:客户端过滤(最可靠)
目前GCS的API不支持按对象名称后缀进行服务端过滤,所以最稳妥的方式是在获取对象属性后,直接判断名称是否以/结尾来跳过“文件夹”对象:
修改你的代码,在处理对象前添加判断逻辑:
import "strings" // ... for { attrs, err := it.Next() if err == iterator.Done { break } if err != nil { errors = append(errors, err) continue } // 跳过名称以/结尾的文件夹对象 if !strings.HasSuffix(attrs.Name, "/") { fmt.Println(attrs) // 在这里执行元数据读取和后续操作 } }
方案2:服务端Query过滤(有局限性)
如果你的“文件夹”对象有统一的特征(比如零大小、特定Content-Type),可以尝试用storage.Query在服务端过滤,但存在一定局限性:
过滤零大小对象
如果所有“文件夹”都是零大小,且你的业务中没有需要保留的零大小文件,可以用以下过滤条件:
query := &storage.Query{ Filters: []storage.Filter{ {Field: "size", Op: ">", Value: "0"}, }, } it := c.client.Bucket(bucket).Objects(ctx, query)
注意:该方式会误过滤掉真正的零大小文件,需结合业务场景使用。
过滤特定Content-Type的对象
若你的“文件夹”对象Content-Type统一为application/x-directory,可以用此条件过滤:
query := &storage.Query{ Filters: []storage.Filter{ {Field: "contentType", Op: "!=", Value: "application/x-directory"}, }, } it := c.client.Bucket(bucket).Objects(ctx, query)
注意:该方式依赖文件夹对象的Content-Type设置,若存在未设置该类型的文件夹或Content-Type匹配的文件,会出现误判。
内容的提问来源于stack exchange,提问作者Diego L
相关产品推荐
相关产品推荐

