从 base64 解码字符串保存的 Django 图像已损坏
Django image saved from base64 decoded string is corrupted
我不知道这里有什么问题,所以我将整个过程描述一下:
首先,我使用 Croppie 让用户在客户端裁剪图像。这个 javascript 库应该 return 一个以 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)
保存的图像已损坏。当我尝试使用文件浏览器打开它时出现错误:
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)
您应该删除 Base64 声明,因为它们本身不是 base64 字符串的一部分。您可以在客户端或服务器端执行此操作,但在服务器端执行此操作的优势在于,如果您决定切换图像格式,该字符串可帮助您确定要发送的文件格式。
这不是最优雅的方式,但您可以:
imagen_decodificada = base64.b64decode(imagen_b64.replace('data:image/jpeg;base64,',''))
我不知道这里有什么问题,所以我将整个过程描述一下:
首先,我使用 Croppie 让用户在客户端裁剪图像。这个 javascript 库应该 return 一个以 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)
保存的图像已损坏。当我尝试使用文件浏览器打开它时出现错误:
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)
您应该删除 Base64 声明,因为它们本身不是 base64 字符串的一部分。您可以在客户端或服务器端执行此操作,但在服务器端执行此操作的优势在于,如果您决定切换图像格式,该字符串可帮助您确定要发送的文件格式。
这不是最优雅的方式,但您可以:
imagen_decodificada = base64.b64decode(imagen_b64.replace('data:image/jpeg;base64,',''))