0

我正在使用 Apache Libcloud 将文件与对象元数据一起上传到 Google Cloud Storage 存储桶。

在此过程中,我的元数据字典中的键被小写。我不确定这是由于 Cloud Storage 还是发生在 Libcloud 中。

可以按照Libcloud 文档中的示例重现该问题:

from libcloud.storage.types import Provider
from libcloud.storage.providers import get_driver

cls = get_driver(Provider.GOOGLE_STORAGE)
driver = cls('SA-EMAIL', './SA.json') # provide service account credentials here


FILE_PATH = '/home/user/file'

extra = {'meta_data': {'camelCase': 'foo'}}

# Upload with metadata
with open(FILE_PATH, 'rb') as iterator:
    obj = driver.upload_object_via_stream(iterator=iterator,
                                          container=container,
                                          object_name='file',
                                          extra=extra)

文件成功上传,但生成的元数据将如下所示: 结果

哪里camelCase变成了camelcase

我不认为 GCS 不允许对象元数据使用驼峰式,因为在这个意义上可以手动编辑元数据: 在此处输入图像描述

我浏览了 Libcloud 的源代码,但没有看到任何明确的小写字母。任何关于如何使用 libcloud 上传驼峰元数据的指示都非常受欢迎。

4

1 回答 1

1

我还检查了图书馆,没有看到任何明显的东西。但我想打开一个新问题会有一个很好的开始。

至于谷歌云存储方面的问题,你可以自己验证它确实承认驼峰式。通过使用他们的公共文档上提供的代码,我能够成功地编辑文件的元数据(但无法在 libcloud 本身上找出一些东西):

from google.cloud import storage


def set_blob_metadata(bucket_name, blob_name):
    """Set a blob's metadata."""
    # bucket_name = 'your-bucket-name'
    # blob_name = 'your-object-name'

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.get_blob(blob_name)
    metadata = {'camelCase': 'foo', 'NaMe': 'TeSt'}
    blob.metadata = metadata
    blob.patch()

    print("The metadata for the blob {} is {}".format(blob.name, blob.metadata))

因此,如果您无法使用 libcloud 解决问题,我相信这可能是您的情况的一个很好的解决方法。请注意,云存储客户端库的身份验证基于环境变量,应遵循以下文档

问题作者添加:正如评论中所暗示的,可以在上传文件之前将元数据添加到 blob,如下所示:

from google.cloud import storage
gcs = storage.Client()
bucket = gcs.get_bucket('my-bucket')
blob = bucket.blob('document')
blob.metadata = {'camelCase': 'foobar'}
blob.upload_from_file(open('/path/to/document', 'rb'))

这允许在无需修补现有 blob 的情况下设置元数据,并为 libcloud 的问题提供有效的解决方法。

于 2020-12-17T14:15:08.990 回答