我不知道这里有什么问题,所以我将描述整个过程:
首先,我使用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)
答案 0 :(得分:4)
您应该删除Base64声明,因为它们本身不是base64字符串的一部分。您可以在客户端或服务器端执行此操作,但这样服务器端的优点是,如果您决定切换图像格式,该字符串可帮助您确定要发送的文件格式。
这不是最优雅的方式,但你可以:
imagen_decodificada = base64.b64decode(imagen_b64.replace('data:image/jpeg;base64,',''))