Helpers - компьютеры, интернет, программирование

Сохранение декодированного временного изображения в Django Imagefield

Я пытаюсь сохранить изображения, которые были переданы мне в виде закодированного текста Base64, в поле изображения Django.

Но, похоже, не сохраняет правильно. База данных сообщает, что все мои изображения хранятся как «», когда она должна сообщать о них как имя файла, например:

"template_images/template_folders/myImage.png"

Код, который пытается сохранить мои изображения, выглядит следующим образом:

elif model_field.get_internal_type() == "ImageField" or model_field.get_internal_type() == "FileField":  # Convert files from base64 back to a file.
    if field_elt.text is not None:
        setattr(instance, model_field.name, File(b64decode(field_elt.text)))
27.02.2013

Ответы:


1

Прочитав этот ответ , я заставил это работать:

from base64 import b64decode
from django.core.files.base import ContentFile

image_data = b64decode(b64_text)
my_model_instance.cool_image_field = ContentFile(image_data, 'whatup.png')
my_model_instance.save()

Поэтому я предлагаю вам изменить код на:

from django.core.files.base import ContentFile

# Your other code...

elif model_field.get_internal_type() == "ImageField" or model_field.get_internal_type() == "FileField":  # Convert files from base64 back to a file.
    if field_elt.text is not None:
        image_data = b64decode(field_elt.text)
        setattr(instance, model_field.name, ContentFile(image_data, 'myImage.png'))

Затем, предполагая, что ваш ImageField определен с аргументом upload_to, установленным на template_images/template_folders/, вы должны увидеть файл, сохраненный до YOUR_MEDIA_URL/template_images/template_folders/myImage.png.

13.03.2013
  • Я пытался следовать тому же подходу, хотя при декодировании получаю «Неверное заполнение». Любое предложение? 30.10.2013
  • Да, вы не хотите включать начальные данные: image/gif;base64, немного, но тогда, я думаю, вы, вероятно, уже знаете это, только для людей, которые пришли сюда через Google, как и я. 28.02.2014
  • я думаю, что это может потерпеть неудачу, потому что вам не нужно включать data:image/*;base64, часть файла. 20.04.2017

  • 2

    Еще один хороший подход, основанный на этом ответе SO: https://stackoverflow.com/a/28036805/6143656 попробовал и протестировал в джанго 1.10

    Я сделал функцию для декодированного файла base64.

    def decode_base64_file(data):
    
        def get_file_extension(file_name, decoded_file):
            import imghdr
    
            extension = imghdr.what(file_name, decoded_file)
            extension = "jpg" if extension == "jpeg" else extension
    
            return extension
    
        from django.core.files.base import ContentFile
        import base64
        import six
        import uuid
    
        # Check if this is a base64 string
        if isinstance(data, six.string_types):
            # Check if the base64 string is in the "data:" format
            if 'data:' in data and ';base64,' in data:
                # Break out the header from the base64 content
                header, data = data.split(';base64,')
    
            # Try to decode the file. Return validation error if it fails.
            try:
                decoded_file = base64.b64decode(data)
            except TypeError:
                TypeError('invalid_image')
    
            # Generate file name:
            file_name = str(uuid.uuid4())[:12] # 12 characters are more than enough.
            # Get the file name extension:
            file_extension = get_file_extension(file_name, decoded_file)
    
            complete_file_name = "%s.%s" % (file_name, file_extension, )
    
            return ContentFile(decoded_file, name=complete_file_name)
    

    Затем вы можете вызвать функцию

    import decode_base64_file
    
    p = Post(content='My Picture', image=decode_based64_file(your_base64_file))
    p.save()
    
    20.04.2017

    3

    Я думаю, это самый чистый и короткий способ сделать это.

    Вот как вы можете обрабатывать файл изображения в кодировке Base64 в почтовом запросе на конце API на основе Django (также drf), который сохраняет его как ImageField.

    Допустим, у вас есть модель следующим образом:

    Class MyImageModel(models.Model):
          image = models.ImageField(upload_to = 'geo_entity_pic')
          data=model.CharField()
    

    Таким образом, соответствующий сериализатор будет выглядеть следующим образом:

     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)
    

    Соответствующее представление может быть следующим:

    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)
    

    Примечание. В сериализаторе я использовал реализацию Base64ImageField, предоставленную в модуле django-extra-field

    Для установки этого модуля выполните команду

    pip install pip install django-extra-fields
    

    Импортируйте то же самое и Готово!

    Отправьте (методом post) свое изображение в виде строки в кодировке Base64 в объекте JSON вместе с любыми другими данными, которые у вас есть.

    09.03.2017
    Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..