Últimamente estoy recibiendo muchos archivos en formato base64 desde un frontend, y necesito convertirlos a archivos reales para trabajar con ellos (guardarlos, procesarlos, etc.).
Para ello he creado una función que recibe un string en formato base64 y lo convierte en un archivo temporal, devolviendo la ruta del archivo.
def temporary_file_from_base_64(base_64_input: str) -> str:
"""
Convert a base64 string to a temporary file
:param base_64_input: Base64 string
:return: Path to the temporary file
"""
base64_string = base_64_input.strip().split(',')[1]
decoded_bytes = base64.b64decode(base64_string)
file_temp, path_temp = tempfile.mkstemp()
try:
with os.fdopen(file_temp, 'wb') as tmp:
tmp.write(decoded_bytes)
except Exception as e:
os.remove(path_temp)
raise e
return path_temp
Si vas a moverlo o procesarlo, recuerda eliminarlo a continuación:
import os
os.remove(path_temp)
Sino el sistema operativo no sabrá que ya no lo estás utilizando y se quedará ocupando espacio.
Como extra, también he creado una función que devuelve la extensión de un string base64:
from mimetypes import guess_extension
def get_extension_from_base64(base_64_input: str) -> str:
"""
Get the extension of a base64 string
:param base_64_input: Base64 string
:return: Extension of the file
"""
return guess_extension(base_64_input.split(';')[0].split(':')[1])
Puedes utilizar ambas ambas funciones para guardar el archivo con la extensión correcta:
import os
base_64_input = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAA...'
path_temp = temporary_file_from_base_64(base_64_input)
os.rename(path_temp, os.path.join('statics', f'nombre-archivo{get_extension_from_base64(base_64_input)}'))
Ya podéis guardar y procesar vuestros archivos.
{{ comments.length }} comentarios