Сохранение временного (в памяти 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 не проблемой, хотя в этом коде по-прежнему хранится дублированная копия последнего изображения, сохраненного как "img.jpg". Идите и удалите его потом, если хотите.
В любом случае, я оставляю этот вопрос открытым, если кто-то найдет (и поделится) лучшее решение.