2016-03-28 2 views
0

Я использую webcam.js для захвата изображения пользователя при регистрации пользователя на моем шаблоне.Сохранение временных (в памяти строки b64) изображение в Django Imagefield

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

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

На models.py, foto is 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 на моем представлении?

ответ

0

Хорошо, 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. Чтобы избежать ненужных дисковых чтений, некоторые могут сказать, что они SLOW
  2. Чтобы избежать дублирования файлов

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

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

Смежные вопросы