google storage python API - 上传StringIO对象

时间:2017-12-27 13:31:49

标签: python google-cloud-platform stringio

我成功将文件上传到谷歌存储,但我想跳过创建文件并使用 StringIO 而直接在谷歌存储上创建文件。

由于我是python的新手,我只是尝试使用我用来上传创建文件的标准方法:

def cloud_upload(self, buffer, bucket, filename):
    buffer.seek(0)
    client = storage.Client()
    bucket = client.get_bucket(bucket)
    blob = bucket.blob(filename)
    blob.upload_from_filename(buffer)

但我收到错误:

TypeError:期望的字符串或缓冲区

但是既然我给它了StringIO对象,我不知道为什么这不起作用?

3 个答案:

答案 0 :(得分:2)

希望这仍然有意义。但是您可以尝试使用blob.upload_from_string方法

def cloud_upload(self, buffer, bucket, filename):
    client = storage.Client()
    bucket = client.get_bucket(bucket)
    blob = bucket.blob(filename)
    blob.upload_from_string(buffer.getvalue(),content_type='text/csv')

如果要将该文件另存为其他文件类型,请注意修改content_type参数。我以“ text / csv”为例。默认值为“文本/纯文本”。

答案 1 :(得分:0)

我不确定您是如何调用cloud_upload函数的,但您只需使用upload_from_filename函数即可满足您的需求。

def upload_blob(self, bucket_name, source_file_name, destination_blob_name):
    """Uploads a file to the bucket."""
    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)
    blob = bucket.blob(destination_blob_name)

    blob.upload_from_filename(source_file_name)

    print('File {} uploaded to {}.'.format(
        source_file_name,
        destination_blob_name))

答案 2 :(得分:0)

因为您是从文件名上传的。但是应该从文件对象上传。应该是:

blob.upload_from_file(buffer)