Если вам нужно использовать специфичные для провайдера настройки в Go CDK, вы можете использовать различные As
функции , чтобы получить дескрипторы к базовому API провайдера.В этом случае вы хотели бы использовать параметр blob.WriterOptions.BeforeWrite
.Преимущество такого подхода заключается в том, что BeforeWrite
не будет работать, если вы решите сменить провайдера корзины позже (например, для модульного тестирования).
import (
"context"
"io"
"cloud.google.com/go/storage"
"gocloud.dev/blob"
_ "gocloud.dev/blob/gcsblob" // link in "gs://" URLs
)
func upload(ctx context.Context, bucket, keyName, path string, reader io.Reader) error {
bucket, err := blob.OpenBucket(ctx, "gs://" + bucket)
if err != nil {
return err
}
defer bucket.Close()
writeCtx, cancelWrite := context.WithCancel(ctx)
defer cancelWrite()
writer, err := bucket.NewWriter(writeCtx, path, &blob.WriterOptions{
// Use BeforeWrite to set provider-specific properties.
BeforeWrite: func(asFunc func(interface{}) bool) error {
var gcsWriter *storage.Writer
// asFunc returns true if the writer can be converted to the type
// pointed to.
if asFunc(&gcsWriter) {
gcsWriter.KMSKeyName = keyName
}
return nil
},
})
if err != nil {
return err
}
if _, err := io.Copy(writer, reader); err != nil {
cancelWrite() // Abort the write to the bucket.
writer.Close()
return err
}
if err := writer.Close(); err != nil {
return err
}
return nil
}
(Хотя это не имеет прямого отношения к вашему вопросу,Я добавил код, чтобы прервать запись при ошибке, чтобы избежать частичной загрузки объектов вашему провайдеру хранения. Мы добавляем документы, которые покажут, как в будущем выполнять общие задачи с API Go CDK, см. # 1576 .)