Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将临时(内存中的b64字符串)图像保存到Django Imagefield_Django_Django Forms_Webcam.js - Fatal编程技术网

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

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

在用户在我的模板上注册期间,我使用捕获用户的图像

它会提示用户权限,如果同意,在页面上启用“拍照”按钮。单击后,它会在用户的网络摄像头上拍摄快照。在将图片保存到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方法下:

不过,有些考虑是必要的。 这不是直接从内存写入的解决方案,它解决了我的具体问题。这可能会解决你的问题,所以我分享

我想直接从内存中保存它的两个主要原因是:

  • 为了避免不必要的磁盘读取,有些人可能会说它们速度慢
  • 避免文件重复
  • 1号仍然是个问题。我认为数字2不是一个问题,尽管这段代码仍然保留了保存为'img.jpg'的最后一幅图像的副本。如果需要,请继续,然后删除它

    不管怎么说,我一直在讨论这个问题,以防有人找到(并分享)更好的解决方案

                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()