我不知道什麼是錯在這裏,所以我將描述整個過程:圖像解碼的字符串被損壞
首先,我用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