загрузка и сохранение данных изображения base64 в поле изображения Django в среде django rest

avatar
laa
7 апреля 2018 в 23:04
1569
1
3

У меня возникли проблемы с сохранением данных изображения base64 в поле изображения django, вот что я пробовал:

так что в основном я получаю данные изображения base64 из внешнего интерфейса, используя запрос POST axios. затем обработайте данные изображения в моем API-интерфейсе django rest framework.

Я пробовал два варианта:

1) запись декодированного base64 во TemporaryFile, затем передача его в imageField.

2) открытие TemporaryFile с помощью PIL.Image.open(img_temp), а затем преобразование PIL.Image в InMemoryUploadedFile и передача его в imageField.

Однако в обоих случаях я получаю сообщение об ошибке: image : ["Upload a valid image. The file you uploaded was either not an image or a corrupted image."]

Я не совсем понимаю, почему я получаю эту ошибку, потому что, когда я использовал img.show(), изображение получалось нормально.

остальная структура Django

        base64_data = request.data['image_data'][22:]
        decode_image = base64.b64decode(base64_data)
        img_temp = TemporaryFile()
        img_temp.write(decode_image)
        img_temp.flush()

        img = PIL.Image.open(img_temp)
        img_format = '.' + img.format
        img.show()

        image_io = BytesIO()
        img.save(image_io, format=img.format)
        file = InMemoryUploadedFile (
            image_io,
            None,
            'photo' + img_format,
            'image/' + img.format,
            sys.getsizeof(image_io),
            None,
        )
        img.close()

        data = {
            'image': File(img_temp) # I have tried passing File(img_tem) and "file" into the image field
        }

        serializer = ListSerializer(data=data, context={'request': request})
        if serializer.is_valid():
            instance = serializer.save()
            instance.save()
Источник

Ответы (1)

avatar
laa
9 апреля 2018 в 02:26
0

ОБНОВЛЕНИЕ: разобрался

        base64_data = request.data['image_data'][22:]
        decode_image = base64.b64decode(base64_data)

        img = PIL.Image.open(BytesIO(decode_image))
        img_format = '.' + img.format
        img.show()

        fileData = BytesIO(decode_image)
        file = InMemoryUploadedFile ( # arguments: 'file', 'field_name', 'name', 'content_type', 'size', and 'charset'
            fileData,
            None,
            'photo' + img_format,
            'image',
            len(decode_image),
            None,
        )
        img.close()

        data = {
            'image': file
        }

        serializer = ListSerializer(data=data, context={'request': request})
        if serializer.is_valid():
            instance = serializer.save()
            instance.save()