从base64解码的字符串保存的Django图像已损坏

时间:2016-07-06 16:34:28

标签: ajax django image encoding base64

我不知道这里有什么问题,所以我将描述整个过程:

首先,我使用Croppie让用户在客户端裁剪图像。这个javascript库应该返回一个在base64中编码的有效canvas对象。然后我用$.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)

保存的图像已损坏。当我尝试使用文件浏览器打开它时,我收到错误:

  

解释JPEG图像文件时出错(不是JPEG文件:以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)

1 个答案:

答案 0 :(得分:4)

您应该删除Base64声明,因为它们本身不是base64字符串的一部分。您可以在客户端或服务器端执行此操作,但这样服务器端的优点是,如果您决定切换图像格式,该字符串可帮助您确定要发送的文件格式。

这不是最优雅的方式,但你可以:

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