如何将 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
分块上传文件。
我正在使用 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
分块上传文件。