我正在使用webcam.js在用户在我的模板上注册时捕获用户的图像。
提示用户许可,如果同意,则在页面上启用“拍照”按钮。点击后,它会在用户的网络摄像头上拍摄快照。所有工作直到将图片保存到django的ImageField。
虽然它建议使用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字符串的任何建议?
答案 0 :(得分:0)
好的,3天没有任何评论或答案,我已经完成了解决我的问题的方法:
post方法下的:
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”。如果你愿意,可以继续删除它。
无论如何,如果有人找到(并分享)更好的解决方案,我会保持这个问题。