tutorial tipos personalizados partir modelos formularios fields example ejemplos avanzados django django-forms django-file-upload python-magic

tipos - ¿Cómo se usa magia para verificar el tipo de archivo en un método de limpieza de formularios de Django?



formularios personalizados django (3)

Stan describió una buena variante con buffer. Lamentablemente, la debilidad de este método es leer el archivo en la memoria. Otra opción es usar el archivo almacenado temporal :

import tempfile import os tmp_file_name = request.FILES[''my_file_field''].name tmp_file_dir = tempfile.gettempdir() # usually /tmp on Unix tmp_file_path = os.path.join(tmp_file_dir, tmp_file_name) mime = magic.Magic(mime=True) file_mime_type = mime.from_file(tmp_file_path) # then check mime and raise ValidationError if required

He escrito una clase de formulario de correo electrónico en Django con un FileField. Quiero verificar el tipo de archivo del archivo cargado por su tipo. Posteriormente, quiero limitar los tipos de archivos a documentos pdfs, word y abrir documentos de oficina.

Para este fin, he instalado python-magic y me gustaría verificar los tipos de archivos de la siguiente manera según las especificaciones de python-magic:

mime = magic.Magic(mime=True) file_mime_type = mime.from_file(''address/of/file.txt'')

Sin embargo, los archivos cargados recientemente carecen de direcciones en mi servidor. Tampoco conozco ningún método del objeto mime similar a "from_file_content" que comprueba el tipo de mime dado el contenido del archivo.

¿Cuál es una forma efectiva de usar magia para verificar los tipos de archivos cargados en los formularios de Django?


¿Por qué no intentar algo así en su punto de vista?

m = magic.Magic() m.from_buffer(request.FILES[''my_file_field''].read())

O para ser más agradable con la memoria:

m.from_buffer(request.FILES[''my_file_field''].chunks())

Ah, disculpa, acabo de ver que quieres eso en tu validación de formulario, pero deberías hacer lo mismo con el cleaned_data formulario cleaned_data .


mime = magic.Magic(mime=True) attachment = request.FILES[''attachment''] if hasattr(attachment, ''temporary_file_path''): # file is temporary on the disk, so we can get full path of it. mime_type = mime.from_file(attachment.temporary_file_path()) else: # file is on the memory mime_type = mime.from_buffer(attachment.read())