user6600549
user6600549

Reputation:

How to save base64 image in python flask server

I try to save a base64 image string that comes from HTTP post request and for some reason, I get multiple different errors

binascii.Error: Incorrect padding

Also, i look at this StackOverflow question but is not working Convert string in base64 to image and save on filesystem in Python

but in the end, I get a png file that is 0 bytes

My question is how I can save a base64 string image on my server filesystem

I get this error

return binascii.a2b_base64(s)

What I get is this format from the client side:

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wCEAAICAgICAgMCAgMFAwMDBQYFBQUFBggGBgYGBggKCAgIC.....AgICgoKC/vuJ91GM9en4hT/AI3TLT8PoqYVw//Z

From the client side I send this request

{
      "img" : "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wCEAAICAgICAgMCAgMFAwMDBQYFBQUFBggGBgYGBggKCAgIC.....AgICgoKC/vuJ91GM9en4hT/AI3TLT8PoqYVw//Z"
}

in my python code, I have this method to read and save the base64 image

@app.route('/upload', methods=['POST']) 
def upload_base64_file(): 
    """ 
        Upload image with base64 format and get car make model and year 
        response 
    """

  data = request.get_json()
  # print(data)

  if data is None:
      print("No valid request body, json missing!")
      return jsonify({'error': 'No valid request body, json missing!'})
  else:

      img_data = data['img']

      # this method convert and save the base64 string to image
      convert_and_save(img_data)




def convert_and_save(b64_string):

    b64_string += '=' * (-len(b64_string) % 4)  # restore stripped '='s

    string = b'{b64_string}'

    with open("tmp/imageToSave.png", "wb") as fh:
        fh.write(base64.decodebytes(string))

Upvotes: 2

Views: 18413

Answers (1)

Andriy Makukha
Andriy Makukha

Reputation: 8304

You get error when doing base64.decodebytes(string) because your variable string is always equal to b'{b64_string}'. And it just has characters which are not in Base64 alphabet.

You could use something like:

def convert_and_save(b64_string):
    with open("imageToSave.png", "wb") as fh:
        fh.write(base64.decodebytes(b64_string.encode()))

Moreover, it's strange that you send JPEG files and save them with PNG filename extension.

Upvotes: 12

Related Questions