2

我在 Flask 中使用Backblaze B2b2sdk.v2来上传文件。

这是我尝试过的代码,使用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'

我认为这是因为我使用参数的FileStorage实例upload_source

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

谢谢

4

1 回答 1

1

你是对的 - 你不能将 FlaskFileStorage实例用作 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以分块上传文件。

于 2022-01-12T19:10:44.237 回答