2016-07-06 101 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