将临时(内存中的b64字符串)图像保存到Django Imagefield
在用户在我的模板上注册期间,我使用捕获用户的图像 它会提示用户权限,如果同意,在页面上启用“拍照”按钮。单击后,它会在用户的网络摄像头上拍摄快照。在将图片保存到django的ImageField之前,所有操作都将正常进行 虽然它建议使用AJAX(我在一百万年内无法理解)将其上传到我的服务器,但我已经做了一些修改,通过一个隐藏的输入字段传递base64字符串。我还成功地解码了base64字符串并将其保存为服务器上的文件“.jpeg”。 我希望将其从内存中保存,而不将其写入磁盘 在models.py上,将临时(内存中的b64字符串)图像保存到Django Imagefield,django,django-forms,webcam.js,Django,Django Forms,Webcam.js,在用户在我的模板上注册期间,我使用捕获用户的图像 它会提示用户权限,如果同意,在页面上启用“拍照”按钮。单击后,它会在用户的网络摄像头上拍摄快照。在将图片保存到django的ImageField之前,所有操作都将正常进行 虽然它建议使用AJAX(我在一百万年内无法理解)将其上传到我的服务器,但我已经做了一些修改,通过一个隐藏的输入字段传递base64字符串。我还成功地解码了base64字符串并将其保存为服务器上的文件“.jpeg”。 我希望将其从内存中保存,而不将其写入磁盘 在models.py
foto
是图像字段。我正在使用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字符串有什么建议吗?好的,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()