Сохранение временного (в памяти b64 строки) изображения в Django Imagefield

Я использую webcam.js для захвата изображения пользователя во время регистрации пользователя в моем шаблоне.

Он запрашивает разрешение пользователя и, если согласен, включает кнопку "Сфотографировать" на странице. При нажатии он делает снимок на веб-камеру пользователя. Все работает до сохранения изображения в ImageField от django.

Хотя он рекомендует использовать AJAX (который я не могу понять за миллион лет) для загрузки его на мой сервер, я немного изменил его, чтобы пропустить строку base64 через скрытое поле ввода. Мне также удалось декодировать строку base64 и сохранить ее как файл '.jpeg' на сервере. Я хочу сохранить его из памяти, не записывая его на диск.

На models.py, foto это ImageField. Я использую Django 1.9.4 и Postgres 9.4

Хватит говорить, вот моя попытка кодирования, которая сохраняет все, кроме изображения:

views.py

class view1(View):

    def post(self, request, *args, **kwargs):
        form = UserForm(request.POST or None)
        form.foto = b64decode(request.POST['foto'][-(len(request.POST['foto']) - 24):])
        #decoding 'foto' received from POST, some stripping is needed
        if form.is_valid():
            instance = form.save(commit=False)
            instance.save()
            return HttpResponseRedirect()
    else:
        return HttpResponseRedirect()

шаблон

    <form>
            <input type='submit' value="Submit">
            <input type='hidden' id='foto' name='foto'> 
    </form>

  <!--- JS from webcam.js takes picture and pass b64 string to #foto--->
  <!--- document.getElementById('foto').value="'"+data_uri+"'"; added to function "take_snapshot" --->

Любые предложения о том, как управлять строкой B64 на мой взгляд?

1 ответ

Хорошо, 3 дня без каких-либо комментариев или ответов, я нашел решение моей проблемы:

по почтовому методу:

            img_data = b64decode(request.POST['foto'][-(len(request.POST['foto']) - 24):])
            fh = open(PATH.join(MEDIA_ROOT, 'img.jpeg'), 'w+b')
            fh.write(img_data)
            instance.foto = File(fh)
            instance.save()
            fh.close()

Некоторые соображения необходимы, хотя. Это не решение, чтобы написать это непосредственно из памяти, это решает мою конкретную проблему. Это может решить твое, так что я делюсь.

Основными двумя причинами, по которым я хотел сохранить его непосредственно из памяти, были:

  1. Чтобы избежать ненужных чтений с диска, некоторые могут сказать, что они МЕДЛЕННЫЕ
  2. Чтобы избежать дублирования файлов

Номер 1 по-прежнему проблема. Я считаю номер 2 не проблемой, хотя в этом коде по-прежнему хранится дублированная копия последнего изображения, сохраненного как "img.jpg". Идите и удалите его потом, если хотите.

В любом случае, я оставляю этот вопрос открытым, если кто-то найдет (и поделится) лучшее решение.

Другие вопросы по тегам