2016-07-06 90 views
0

我不知道什麼是錯在這裏,所以我將描述整個過程:圖像解碼的字符串被損壞

首先,我用Croppie讓用戶在客戶端上裁剪圖像。這個JavaScript庫應該會返回一個有效的canvas在base64中編碼的對象。然後,我$.ajax()發送圖像:

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) 
       } 
      }); 

然後,我得到了Django的編碼字符串,將其解碼並保存到一個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 vs 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