Estoy trabajando en una aplicación web de Django que permite a los usuarios cargar presentaciones. La presentación debe convertirse en imágenes, una para cada diapositiva, y las imágenes deben guardarse en un ImageField como parte de un modelo. Sin embargo, cuando trato de guardar la imagen local en el modelo, Django lanza un UnicodeDecodeError en el encabezado del archivo de imagen.
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
Leí un poco y descubrí que esto es parte del encabezado válido para un archivo de imagen PNG. Parece que, por alguna razón, Django está intentando decodificar el archivo binario como Unicode.
Aquí está el modelo en el que estoy intentando guardar la imagen:
class PresentationSlide(models.Model): ... image = models.ImageField(upload_to=upload_to) La función upload_to guarda los archivos cargados con un UUID codificado en base64.
En una vista, valido el formulario, obtengo el archivo de presentación y uso una biblioteca personalizada para convertirlo en imágenes individuales en un directorio temporal. La idea entonces es crear una instancia de PresentationSlide para cada una de estas imágenes.
A continuación se muestra cómo intento crear las instancias del modelo y guardar las imágenes.
presentation = Presentation.objects.create( description=form.cleaned_data['description']) slides = [PresentationSlide.objects.create( presentation=presentation, order=order, duration=form.cleaned_data['slide_interval']) for order, image in enumerate(slide_images)] for image_path, slide in zip(sorted(slide_images), slides): with open(image_path) as image: slide.image.save(image.name, File(image))¿Qué está causando que Django intente decodificar este archivo binario como texto Unicode?
Asegúrese de abrir el descriptor de archivo en modo binario.
for image_path, slide in zip(sorted(slide_images), slides): with open(image_path, mode='rb') as image: slide.image.save(image.name, File(image)) Por defecto, open devolverá un TextIOWrapper que intenta interpretar el texto.