es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener el tipo MIME del archivo que se encuentra en memoria – Python Django

Tengo un formulario donde los usuarios pueden cargar archivos. Solo quiero que puedan cargar imágenes. He agregado eso al formulario HTML, pero necesito hacer una verificación en el lado del servidor. Me gustaría hacer esta verificación antes de guardar el archivo en AWS S3.

Actualmente tengo esto:

from .models import cropSession, cropSessionPhoto

import magic

def crop(request):
    if request.method == 'POST':
        data = request.POST
        images = request.FILES.getlist('photos')
        crop_style = data['style']

        if len(images) <= 0:
            messages.error(request, "Debe cargar al menos una foto.")
            return redirect(reverse('crop-form'))

        crop_session = cropSession(crop_style=crop_style)
        crop_session.save()
        for image in images:
            mime = magic.Magic(mime=True)
            mime.from_file(image.file)
            upload = cropSessionPhoto(crop_session=crop_session, photo_file_name=image, photo_file_location=image)
            upload.save()

    else:
        messages.error(request, "Ha ocurrido un error.")
        return redirect(reverse('crop-form'))

    return render(request, 'crop/crop.html')

Sin embargo, me sale este error:
TypeError: se esperaba str, bytes u objeto os.PathLike, no BytesIO

¿Cómo puedo pasar correctamente la imagen a magic?

Gracias

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puedes pasar la imagen a magic accediendo al método read() en el objeto de archivo de la imagen. Aquí tienes una versión actualizada del código:

    from .models import cropSession, cropSessionPhoto
    
    import magic
    import io
    
    def crop(request):
        if request.method == 'POST':
            data = request.POST
            images = request.FILES.getlist('photos')
            crop_style = data['style']
    
            if len(images) <= 0:
                messages.error(request, "Se debe cargar al menos una foto.")
                return redirect(reverse('crop-form'))
    
            crop_session = cropSession(crop_style=crop_style)
            crop_session.save()
    
            for image in images:
                mime = magic.Magic(mime=True)
                mime_type = mime.from_buffer(io.BytesIO(image.read()).getbuffer())
                if not mime_type.startswith('image'):
                    messages.error(request, 'Solo se permiten imágenes.')
                    crop_session.delete()
                    return redirect(reverse('crop-form'))
                upload = cropSessionPhoto(crop_session=crop_session, photo_file_name=image, photo_file_location=image)
                upload.save()
    
        else:
            messages.error(request, "Se ha producido un error.")
            return redirect(reverse('crop-form'))
    
        return render(request, 'crop/crop.html')
    

    Este código verifica si el tipo MIME del archivo cargado comienza con image. Si no es así, devuelve un mensaje de error y elimina la instancia de cropSession creada anteriormente. Si todos los archivos son imágenes, procede a guardar los archivos cargados en AWS S3.

Comments are closed.