tipo subir restringir imagenes filtrar archivos archivo almacenar django django-forms django-file-upload

restringir - subir archivos django



¿Cómo limitar los tipos de archivos en las cargas de archivos para ModelForms con FileFields? (6)

Mi objetivo es limitar un FileField en un Django ModelForm a PDF y documentos de Word. Todas las respuestas que he buscado en Google se refieren a la creación de un controlador de archivos por separado, pero no estoy seguro de cómo hacerlo en el contexto de un ModelForm. ¿Hay alguna configuración en settings.py que pueda usar para limitar los tipos de archivos de carga?


Crea un método de validación como:

def validate_file_extension(value): if not value.name.endswith(''.pdf''): raise ValidationError(u''Error message'')

e incluirlo en los validadores de FileField como este:

actual_file = models.FileField(upload_to=''uploaded_files'', validators=[validate_file_extension])

Además, en lugar de configurar manualmente las extensiones que permite su modelo, debe crear una lista en su configuración.py e iterar sobre ella.

Editar

Para filtrar múltiples archivos:

def validate_file_extension(value): import os ext = os.path.splitext(value.name)[1] valid_extensions = [''.pdf'',''.doc'',''.docx''] if not ext in valid_extensions: raise ValidationError(u''File not supported!'')


La validación con la extensión de un nombre de archivo no es una forma consistente. Por ejemplo, puedo cambiar el nombre de un picture.jpg a un picture.pdf y la validación no generará ningún error.

Un mejor enfoque es verificar el tipo de contenido de un archivo.

Método de validación

def validate_file_extension(value): if value.file.content_type != ''application/pdf'': raise ValidationError(u''Error message'')

Uso

actual_file = models.FileField(upload_to=''uploaded_files'', validators=[validate_file_extension])


Manejé esto usando un método clean_ [your_field] en un ModelForm. Puede establecer una lista de extensiones de archivo aceptables en settings.py para verificar en su método de limpieza, pero no hay nada integrado en settings.py para limitar los tipos de carga.

Django-Filebrowser, por ejemplo, toma el enfoque de crear una lista de extensiones de archivo aceptables en settings.py.

Espero que te ayude.


Para un uso más genérico, escribí un ExtensionValidator clase pequeña que extiende el RegexValidator incorporado de RegexValidator . Acepta extensiones simples o múltiples, así como un mensaje de error personalizado opcional.

class ExtensionValidator(RegexValidator): def __init__(self, extensions, message=None): if not hasattr(extensions, ''__iter__''): extensions = [extensions] regex = ''/.(%s)$'' % ''|''.join(extensions) if message is None: message = ''File type not supported. Accepted types are: %s.'' % '', ''.join(extensions) super(ExtensionValidator, self).__init__(regex, message) def __call__(self, value): super(ExtensionValidator, self).__call__(value.name)

Ahora puede definir un validador en línea con el campo, por ejemplo:

my_file = models.FileField(''My file'', validators=[ExtensionValidator([''pdf'', ''doc'', ''docx''])])


Una forma más fácil de hacerlo es la siguiente en su formulario

file = forms.FileField(widget=forms.FileInput(attrs={''accept'':''application/pdf''}))


Uso algo en este sentido (para esto se requiere "nota:" pip install filemagic "):

import magic def validate_mime_type(value): supported_types=[''application/pdf'',] with magic.Magic(flags=magic.MAGIC_MIME_TYPE) as m: mime_type=m.id_buffer(value.file.read(1024)) value.file.seek(0) if mime_type not in supported_types: raise ValidationError(u''Unsupported file type.'')

Probablemente también podría incorporar los ejemplos anteriores en este ejemplo, por ejemplo, también verifique el tipo de extensión / carga (que podría ser más rápido como control primario que magia). Esto todavía no es infalible, pero es mejor, ya que se basa más en los datos. en el archivo, en lugar de los encabezados proporcionados por el navegador.

Nota: esta es una función de validación que querría agregar a la lista de validadores para el modelo FileField.