Преобразование файла изображения в Base64 и хранение в базе данных с помощью django rest framework
Я пытаюсь загрузить файл изображения и сохранить его в формате base64 в PostgreSQL, используя Django Rest Framework. Мои файлы следующие:
**Models.py:**
from django.db import models
import base64
class MyImageModel(models.Model):
image_file = models.ImageField( upload_to="photos/", max_length=6000, null = True)
def save(self, *args, **kwargs):
if self.image_file:
file = str(self.image_file)
image = open(file, 'rb')
image_read = image.read()
self.image_64_encode = base64.encodebytes(image_read)
print('This is the image in base64: ' + str(self.image_64_encode))
super(MyImageModel, self).save(*args, **kwargs)
**serializers.py:**
from django.forms import ImageField
from drf_extra_fields.fields import Base64ImageField
from .models import *
from rest_framework import serializers
class MyImageModelSerializer(serializers.ModelSerializer):
image_file = serializers.ImageField
class Meta:
model = MyImageModel
fields = ('image_file',)
**Views.py:**
from .models import *
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
import base64
from imagebase64app.serializers import MyImageModelSerializer
# Create your views here.
class AddImageView(APIView):
def post(self, request, format=None):
serializer = MyImageModelSerializer(data = request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response({'message':'Registered Successfully!'},status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
сначала вы должны взять значение изображения (base 64) из данных request.POST, затем преобразовать это значение (base 64) в файл изображения и сохранить его в нужный вам маршрут (photos/
) и, наконец, просто сохранить путь к изображению в поле image_file
вашей модели
что-то вроде этого в представлениях
user = User.objects.filter(id=1) #example
p_img = request.POST.get('image')
try:
img_name = 'your desired image name' + '.png'
path = 'photos/' + img_name
img_data = base64.b64decode(p_img)
with open(path, 'wb') as g:
g.write(img_data)
except Exception as e:
img_name = 'p_img'
user.update(profile_image=img_name)
вы можете Base64ImageField из drf_extra_fields.fields
в вашем сериализаторе
сохранить вашу модель как есть
и обновить ваш сериализатор до
class MyImageModelSerializer(serializers.ModelSerializer):
image_file = Base64ImageField(required=True)
class Meta:
model = MyImageModel
fields = ('image_file',)