如何将 FileStorage 对象转换为 b2sdk.v2.AbstractUploadSource in Python

How to convert FileStorage object to b2sdk.v2.AbstractUploadSource in Python

我正在使用 Backblaze B2 and b2sdk.v2 在 Flask 中上传文件。

这是我尝试过的代码,使用 upload 方法:

# I am not showing authorization code...
def upload_file(file):
  bucket = b2_api.get_bucket_by_name(bucket_name)
  file = request.files['file']
  bucket.upload(
        upload_source=file,
        file_name=file.filename,
    )

这显示了这样的错误

AttributeError: 'SpooledTemporaryFile' object has no attribute 'get_content_length'

我认为这是因为我正在为 upload_source 参数使用 FileStorage 实例。

我想知道我是否正确使用了 API,如果没有,我应该如何使用它?

谢谢

您是对的 - 您不能将 Flask FileStorage 实例用作 B2 SDK UploadSource。您需要做的是对文件内容使用 upload_bytes 方法:

def upload_file(file):
  bucket = b2_api.get_bucket_by_name(bucket_name)
  file = request.files['file']
  bucket.upload_bytes(
        data_bytes=file.read(),
        file_name=file.filename,
        ...other parameters...
    )

请注意这会将整个文件读入内存。如果出现问题(通常是网络),upload_bytes 方法可能需要重新开始上传,因此文件无法真正直接流式传输到 B2。

如果您预计您的文件不适合内存,您应该考虑使用 create_file_stream 分块上传文件。