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())