"""Definition of put_image function.""" import logging import os from hashlib import md5 from io import BytesIO from minio import Minio from PIL import Image def put_image( client: Minio, image: Image.Image, ) -> str: """Put image in image subfolder in bucket in Minio and return MD5 checksum used as object name.""" assert isinstance(client, Minio) assert isinstance(image, Image.Image) bucket_name = os.getenv('MINIO_BUCKET_NAME', default='') assert len(bucket_name) > 0 subfolder = 'images' # save image to buffer buffer = BytesIO() image.save(buffer, 'png') # get md5 of image checksum = md5(buffer.getbuffer()).hexdigest() # prepare for saving num_bytes = buffer.tell() buffer.seek(0) # send data to bucket object_name = f'{subfolder}/{checksum}' try: client.put_object( bucket_name=bucket_name, object_name=object_name, length=num_bytes, data=buffer, ) except Exception as exc: logging.error('failed saving data to MinIO') raise exc logging.debug('saved data to %s', object_name) return checksum