Guarda la imagen base64 en el campo del archivo django

Tengo entrada siguiente

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA7YAAAISCAIAAAB3YsSDAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAA5JxJREFUeNrsnQl4FEX6xqcJJEAS7ivhBkMAQTSJ4h0QEQ+I90rAc1cOL3QBXXV1AV1dVwmrsCqQ9VwJ6HoC7oon0T8iEkABwRC5IeE+kkAIkPT/nfmSmprunskk5CDw/p55hu7qOr76api8........" 

Quiero guardar este archivo en el campo de archivo. ¿Que puedo hacer?

modelos.py

 class SomeModel(models.Model): file = models.FileField(upload_to=get_upload_report) created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) 

Estoy tratando de hacer esto

 def get_file(data): from django.core.files import File return File(data) 

y guardar el archivo de retorno a la instancia del modelo

 somemodel.file = get_file(image_base64_data) 

pero da un error siguiente

 AttributeError at /someurl/ 'File' object has no attribute 'decode' 

 import base64 from django.core.files.base import ContentFile format, imgstr = data.split(';base64,') ext = format.split('/')[-1] data = ContentFile(base64.b64decode(imgstr), name='temp.' + ext) # You can save this as file instance. 

Usa este fragmento de código para decodificar la cadena base64.

 import base64 from django.core.files.base import ContentFile image_data = requestData['user']['image'] format, imgstr = image_data.split(';base64,') print("format", format) ext = format.split('/')[-1] data = ContentFile(base64.b64decode(imgstr)) file_name = "'myphoto." + ext user.image.save(file_name, data, save=True) # image is User's model field 

Esta pregunta parece que debería ayudar: Django: ¿cómo crear un archivo y guardarlo en el FileField de un modelo?

Debería poder decodificar la cadena base64 y proporcionar eso como el argumento de content a FieldFile.save :

Es un hilo viejo, pero esto puede ser útil:

 import base64 from django.core.files.base import ContentFile def base64_file(data, name=None): _format, _img_str = data.split(';base64,') _name, ext = _format.split('/') if not name: name = _name.split(":")[-1] return ContentFile(base64.b64decode(_img_str), name='{}.{}'.format(name, ext)) 

y puedes usarlo como:

 from my_app.models import ImageModel, FileModel image = ImageModel.objects.create(base64_file(img_base64_str)) # or even base64 files, with custome name file = FileModel.objects.create(base64_file(data=img_base64_str, name="custome_name")) 

y también si necesita archivos codificados en base64 para la prueba, aquí tiene:

 test_file_1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAIAAAC1w6d9AAAAh3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjadY7LDcQwCETvVJESMOAByllFiZQOtvzFcqzksu8AoxGfoeN7nbQNGgtZ90ACXFhayqdE8ESZm3Abverk7tpKyWOTyhTIcLZn0G5/0RWB080dHTt2qetyqGhUrT0aV3nEyNc3XYn++CvFD0K++CiA8L3JkZjpSREY+/eHBhY2tldCBlbmQ9InciPz5pZgYrAAAAA3NCSVQICAjb4U/gAAAAR0lEQVRYw+3OsREAEBAAQfT+ORHdviJeINgr4GZ7ZranxVmxZ/0z2q+RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVW7puAGvSEr+egAAAAASUVORK5CYII=" test_file_2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAh3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjadY7BDcQwCAT/VJESMOAFyjlFiZQOrvzDcqzkc/OA1QoW6PheJ22DxkLWPZAAF5aW8ikRPFHmJtxGrzq5u7ZS8tikMgUynO0ZtNtfdEXgdHNHx45dKl0OFY2qtUcjlccb+bq2QvSPv774AUKGLB/+CiA8L3JkZjpSREY+/eHBhY2tldCBlbmQ9InciPz6tm16TAAAAA3NCSVQICAjb4U/gAAABAUlEQVRYw+3ZOxKCMBAG4MSx8RaewArHNNB6BWsrU0GfOr1Uch4oxIE7YbGKFRIgD4r/rxhmgG92eSwT3nUdW182bJUBCyywwALLSrbWz6iLvN+umrps69FDkkjER8EYU7eU9vAl38Sqrcv2ZX55kySRUDKdzKJi6Mc9fBP9UIxY1CCL3VnEIo3PwoywdJEH1/xYushDdepP+O6wx1seLLDAAgsssFzM8lNHZJriKf0s74+lZPalnOJIhKlWj+gLEKaJ1A6TSjhnUUnm1cMyyx1lDkvJzFaDLLA8a0ZY9MftXzPIUjJzfd9MYNHjvQbQJ+frpWye3crCsbgCFlhgDeUNRU3xJbLa0C4AAAAASUVORK5CYII="