2016-07-06 4 views
0

を破損している私はここで間違っているかわからないので、私は全体のプロセスを説明しますデコード。このjavascriptライブラリは、base64でエンコードされた有効なcanvasオブジェクトを返します。その後、私は$.ajax()で画像を送信します。Djangoの画像は、文字列が

croppie_div.croppie('result', { 
      type: 'canvas', 
      size: 'original', 
      format: 'jpeg' 
     }).then(function(resp){ 
      $.ajax({ 
       url: "{% url 'recortar_carta_ajax' %}", 
       method: "POST", 
       data: {'csrfmiddlewaretoken': "{{ csrf_token }}", 'imagen': resp, 'carta_id': "{{ carta_magicpy.id }}"}, 
       success: function(r){ 
        alert(r) 
       }, 
       error: function(r){ 
        alert(r) 
       } 
      }); 

その後、私はそれをデコードし、ImageFieldに保存し、ジャンゴでエンコードされた文字列を取得:

if request.is_ajax(): 

     carta_id = request.POST.get("carta_id") 
     imagen_b64 = request.POST.get("imagen") 

     imagen_decodificada = base64.b64decode(imagen_b64) 

     carta_magicpy = CartaMagicPy.objects.get(id=carta_id) 
     imagen_django = ContentFile(imagen_decodificada, "imagen.jpeg") 
     carta_magicpy.imagen.save("imagen.jpeg", imagen_django, save=True) 

保存した画像が破壊されています。ファイルブラウザで開こうとすると、エラーが表示されます。

Error interpreting JPEG image file (Not a JPEG file: starts with 0x75 0xab)

これをデバッグする方法はわかりません。どのようにエラーを見つけることができますか?どんな助言も役に立ちます。

これはモデルです:

def ubicar_magicpy(instance, filename): 
    # Para ubicar las imágenes de magicpy 
    path = "/".join([instance.grupo.nombre, "imagen.jpeg"]) 
    return path 

class CartaMagicPy(models.Model): 
    imagen = models.ImageField(null=True, upload_to=ubicar_magicpy) 
+0

:http://foliotek.github.io/Croppie/は、Croppieは、PNGなどを返します。これはJPEGとして読み込めない理由を説明しています。 PNG拡張子で保存するのはどうでしょうか? – raphv

+0

こんにちは@raphv。私は今それをテストします。しかし、上記のコードが示すように、私は 'jpeg'のフォーマットを手動で定義します。 – alejoss

+0

申し訳ありませんが、私は気づいていませんでした。結果ファイルが空でないかどうか教えてください。それが空であれば、base64と同じ "フレーバー"(例えばpythonのurlsafe_b64decodeとstandard_b64decode)を使用しようとしていることを確認する必要がありますhttps://docs.python.org/2/library/base64.html – raphv

答えて

4

彼らはbase64文字列自体の一部ではありませんとしてあなたは、Base64で宣言を削除する必要があります。クライアント側とサーバー側のどちらでもできますが、サーバー側を使用する利点は、イメージ形式を切り替えると、その文字列が送信されるファイル形式を判断するのに役立ちます。

これはそれを行うための最もエレガントな方法はありませんが、あなたが持っている可能性が:私はここに読んだから

imagen_decodificada = base64.b64decode(imagen_b64.replace('data:image/jpeg;base64,','')) 
+0

本当にありがとう! – alejoss

関連する問題