Oto jak można obsługiwać plik obrazu zakodowany w Base64 w żądaniu postu na końcu API opartym na Django (DRF), który zapisuje go jako ImageField.
powiedzmy masz model następująco:
Class MyImageModel(models.Model):
image = models.ImageField(upload_to = 'geo_entity_pic')
data=model.CharField()
Więc analogicznym serializer będzie następująco:
from drf_extra_fields.fields import Base64ImageField
Class MyImageModelSerializer(serializers.ModelSerializers):
image=Base64ImageField()
class meta:
model=MyImageModel
fields= ('data','image')
def create(self, validated_data):
image=validated_data.pop('image')
data=validated_data.pop('data')
return MyImageModel.objects.create(data=data,image=image)
Odpowiedni View może być następująca:
elif request.method == 'POST':
serializer = MyImageModelSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
Uwaga W Serializatorze wykorzystałem implementację Base64ImageField dostępną w module django-extra-field
Aby zainstalować ten moduł uruchomić polecenie
pip install django-extra-fields
import samo i Gotowe!
Wyślij (metodą pocztową) obraz jako zakodowany ciąg Base64 w obiekcie JSON wraz z innymi posiadanymi danymi.
Czy kiedykolwiek to wymyśliłeś? –
Tak i nie. Przechowuję obraz jako tekst, a następnie renderowanie go na stronie internetowej jest dość łatwe, w znaczniku 'img' umieszczasz' src = "data: image/png; base64,. Nie jestem pewien, czy to najlepszy sposób, ale działa dobrze i jest łatwy do wdrożenia. –
gozzilli
@gozzilli możesz zapewnić najszerszy dostęp do widoku/serializera/modeli rozwiązania opartego na base64? – andi