2016-03-28 14 views
0

webcam.js私は自分のテンプレートにユーザーが登録されている間にユーザーの画像をキャプチャしています。Django Imagefieldに一時的な画像(メモリb64文字列内)を保存

ユーザーの許可を求め、同意する場合は、ページ上の「写真を撮る」ボタンを有効にします。クリックすると、ユーザーのウェブカメラでスナップショットが作成されます。 djangoのImageFieldに画像を保存するまではすべて動作します。

私はAJAX(これは何百万年にもわたっては理解できません)を使用してサーバーにアップロードすることをお勧めしますが、非表示の入力フィールドでbase64文字列を渡すように少し修正しました。私はbase64の文字列をデコードし、それをサーバ上のファイル '.jpeg'として正常に保存することもできました。 私はそれをディスクに書き込まずにメモリから保存したいと思います。

models.pyでは、fotoがImageFieldです。

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" ---> 
:私はここに画像以外のすべてを保存し、私のコーディングの試みだ、

十分な話ジャンゴ1.9.4およびPostgresの9.4を使用しています

私のビューでb64文字列を管理する方法に関する提案はありますか?

答えて

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はまだ問題です。私は問題ではないと考えていますが、このコードでは最後のイメージのコピーが 'img.jpg'として保存されます。必要に応じて後で削除してください。

とにかく、誰かがより良い解決策を見つけて(そして共有する)ために、私はこの質問を開いています。

関連する問題