我使用Backblaze B2和b2sdk。
这是我尝试的代码,使用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,如果不是,我应该如何使用它?
感谢你是正确的-你不能使用FlaskFileStorage
实例作为B2 SDKUploadSource
。您需要做的是对文件的内容使用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
来上传文件块。