正如标题所说,我如何验证文件是否已成功上传到干净的存储桶。我们有 3 个存储桶(未扫描、干净、隔离)和恶意软件扫描程序 (ClamAV)。首先,文件上传到未扫描的存储桶,然后传输到干净或隔离的存储桶。我的问题是我如何知道我上传的文件是否已上传到干净存储桶或隔离存储桶。我使用 Golang 作为后端语言。我看到我们有云存储订阅,但是当我尝试获取消息时它说
此订阅类型不支持此方法
看来我们不能以这种方式使用存储订阅。
我能想到的确认上传文件的另一种方法是查询 ClamAV 扫描的日志并查找文件是否被感染。正确的方法是什么?
在这个示例中我不能只添加:
err = sub.Receive(ctx, func(ctx context.Context, m *pubsub.Message) {
fmt.Println(m.Data)
m.Ack() // Acknowledge that we've consumed the message.
})
``` it says this method is not supported for this subscription type...
Cloud Storage 订阅旨在将发布到 Pub/Sub 的消息写入指定存储桶中的文件。它并非旨在提供有关通过其他方式上传的文件的状态信息。您可能正在寻找的是Cloud Storage 的 Pub/Sub 通知,当存储桶中的文件被创建、删除、存档或更新其元数据时,它会向 Pub/Sub 主题发布消息。
在您的场景中,您将创建一个 Pub/Sub 主题,创建一个 Pub/Sub 拉取订阅,并在您的 GCS 存储桶上创建通知:
> gcloud pubsub topics create TOPIC_NAME
> gcloud pubsub subscriptions create SUBSCRIPTION_NAME --topic=TOPIC_NAME
> gcloud storage buckets notifications create gs://BUCKET_NAME --topic=TOPIC_NAME
在订阅者中,您将查找属性
eventType
设置为 OBJECT_FINALIZE
的消息:
err = sub.Receive(ctx, func(ctx context.Context, m *pubsub.Message) {
event := m.Attributes["eventType"]
if (event == "OBJECT_FINALIZE") {
obj := m.Attributes["objectId"]
fmt.Printf("File %s written successfully.\n", obj)
}
m.Ack()
})