将临时(内存b64字符串)图像保存到Django Imagefield

时间:2016-03-28 13:51:37

标签: django django-forms webcam.js

我正在使用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字符串的任何建议?

1 个答案:

答案 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. 为了避免不必要的磁盘读数,有人可能会说它们是SLOW
  2. 避免文件重复
  3. 1号仍然是个问题。我认为2号不是问题,尽管这段代码仍然保留了最后一张图像的副本,保存为“img.jpg”。如果你愿意,可以继续删除它。

    无论如何,如果有人找到(并分享)更好的解决方案,我会保持这个问题。