0

我正在使用webcam.js在用户在我的模板上注册期间捕获用户的图像。

它会提示用户许可,如果同意,则在页面上启用“拍照”按钮。单击时,它会在用户的网络摄像头上拍摄快照。所有工作,直到将图片保存到 django 的 ImageField。

尽管它建议使用 AJAX(我在一百万年内无法理解)将其上传到我的服务器,但我已经进行了一些修改以通过隐藏的输入字段传递 base64 字符串。我还设法解码 base64 字符串并将其成功保存为服务器上的文件“.jpeg”。我希望将其从内存中保存,而不是将其写入磁盘。

在models.py 上,foto是ImageField。我正在使用 Django 1.9.4 和 Postgres 9.4

说得够多了,这是我的编码尝试,它保存了除图像之外的所有内容:

视图.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 字符串的任何建议?

4

1 回答 1

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. 避免文件重复

1号仍然是个问题。我认为数字 2 不是问题,尽管此代码仍保留保存为“img.jpg”的最后一张图像的副本。如果需要,请继续并在之后将其删除。

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

于 2016-03-31T14:34:40.577 回答