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

147 Views Asked by At

I am using Backblaze B2 and b2sdk.v2 in Flask to upload files.

This is code I tried, using the upload method:

# 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,
    )

This shows an error like this

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

I think it's because I am using a FileStorage instance for the upload_source parameter.

I want to know whether I am using the API correctly or, if not, how should I use this?

Thanks

1

There are 1 best solutions below

0
On BEST ANSWER

You're correct - you can't use a Flask FileStorage instance as a B2 SDK UploadSource. What you need to do is to use the upload_bytes method with the file's content:

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...
    )

Note that this reads the entire file into memory. The upload_bytes method may need to restart the upload if something goes wrong (with the network, usually), so the file can't really be streamed straight through into B2.

If you anticipate that your files will not fit into memory, you should look at using create_file_stream to upload the file in chunks.