我不知道什么是错在这里,所以我将描述整个过程:图像解码的字符串被损坏
首先,我用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)
从我读到这里:http://foliotek.github.io/Croppie/,Croppie返回一个PNG作为一个默认的,这将解释为什么它不能被读为JPEG。如何使用PNG扩展名保存它,这是否有效? – raphv
嗨@raphv。我现在会测试。但是,如上面的代码所示,我会手动将格式定义为'jpeg'。 – alejoss
对不起,我没有注意到。你能告诉我,如果结果文件不是空的?如果它是空的,你必须确保你正在尝试使用base64的相同“风格”(例如,python的urlsafe_b64decode vs standard_b64decode)https://docs.python.org/2/library/base64.html – raphv