2017-07-18 2 views
1

Ich habe ein Post-Modell mit einem Dateifeld, das zum Hochladen von Dateien verwendet wird. Wie kann ich den Dateityp validieren (pdf für jetzt, oder jeden anderen Typ, wenn ich später wechsle). Am liebsten würde ich den Inhalt validieren, aber wenn nicht, würde ich auch Suffix tun. Ich habe versucht, online nachzuschlagen, aber die meisten Lösungen, die ich gefunden habe, stammen aus der Vergangenheit und wenn das Django-Dokument aktualisiert wird, funktionieren sie nicht mehr. Bitte, wenn jemand helfen kann. Vielen Dank.Validieren des Upload-Dateityps in Django

class Post(models.Model): 
    author = models.ForeignKey('auth.User',default='') 
    title = models.CharField(max_length=200) 
    text = models.TextField() 
    PDF = models.FileField(null=True, blank=True) 
    created_date = models.DateTimeField(
      default=timezone.now) 
    published_date = models.DateTimeField(
      blank=True, null=True) 

    def publish(self): 
     self.published_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.title 
+0

ich mit empfiehlt https://github.com/ahupp/python-magic – diek

Antwort

3

Mit Django 1.11 können Sie FileExtensionValidator verwenden. Bei früheren Versionen oder zur zusätzlichen Validierung können Sie Ihren eigenen Validator darauf aufbauen. Und Sie sollten wahrscheinlich einen Validator oder so wegen dieser Warnung erstellen:

Don’t rely on validation of the file extension to determine a file’s type. Files can be renamed to have any extension no matter what data they contain.

Hier ist ein Beispielcode mit dem bestehenden Validator:

from django.core.validators import FileExtensionValidator 
class Post(models.Model): 
    PDF = models.FileField(null=True, blank=True, validators=[FileExtensionValidator(['pdf'])]) 

Quellcode ist ebenfalls verfügbar, so dass Sie leicht selbst erstellen können:

https://docs.djangoproject.com/en/1.11/_modules/django/core/validators/#FileExtensionValidator

+0

ich diese Methode versucht, aber bekam eine Fehlermeldung zurück NameError: Name 'FileExtensionValidator' ist nicht definiert – hakuro

+0

Nun, Sie müssen es zuerst importieren. Ich habe die Antwort aktualisiert. Stellen Sie außerdem sicher, dass Sie Django 1.11 verwenden. Andernfalls müssen Sie es basierend auf dem verknüpften Quellcode selbst implementieren. – kichik

+0

Danke für die Lösung. Es funktioniert jetzt gut, aber als ich die falsche Datei aktualisierte, gab es eine Fehlermeldung, die eine lustige Art hatte, das Suffix zu analysieren: Die Dateierweiterung 'xlsx' ist nicht erlaubt. Erlaubte Erweiterungen sind: 'p, d, f'. Ich denke, ich muss noch herausfinden, wie ich meinen eigenen Validator für den Inhalt schreiben kann. – hakuro

1

Erstens würde ich Ihnen raten, 'pdf' 'PDF' zu ändern, dann in ol zu validieren die Versionen von Django, könnten Sie tun, um diesen

forms.py

class PostForm(forms.ModelForm): 
    # fields here 
    class Meta: 
     model = Post 
     fields = ["title", "text", "pdf"] 

    def clean(self): 
     cd = self.cleaned_data 
     pdf = cd.get('pdf', None) 
     if pdf is not None: 
      main, sub = pdf.content_type.split('/') 
      # main here would most likely be application, as pdf mime type is application/pdf, 
      # but I'd like to be on a safer side should in case it returns octet-stream/pdf 
      if not (main in ["application", "octet-stream"] and sub == "pdf"): 
       raise forms.ValidationError(u'Please use a PDF file') 
     return cd 
+0

Das funktioniert gut, wenn ich eine Datei hochlade, aber irgendwie gibt einen Fehler, wenn ich versuche, meine Datei zu bearbeiten und den Anhang zu löschen – hakuro

0

Denken Sie an der Validierung in Bezug auf:

  • Name/Erweiterung
  • Metadaten (Inhaltstyp, Größe)
  • Aktueller Inhalt (ist es wirklich ein PNG, wie der Inhaltstyp sagt, oder ist es eine bösartige PDF?)

Die ersten beiden sind meistens kosmetisch - ziemlich einfach, diese Information zu fälschen. Durch Hinzufügen von Inhaltsüberprüfung (über Datei magic - https://pypi.python.org/pypi/filemagic) fügen Sie ein wenig zusätzlichen Schutz hinzu

Hier ist eine gute, verwandte Antwort: Django: Validate file type of uploaded file Es kann alt sein, aber die Kernidee sollte leicht angepasst werden.

0

Hier ist ein einfaches Beispiel für ein Formular mit Validierungsdateityp basiert auf Django 1.11 FileExtensionValidator

class ImageForm(ModelForm): 
    ALLOWED_TYPES = ['jpg', 'jpeg', 'png', 'gif'] 

    class Meta: 
     model = Profile 
     fields = ['image', ] 

    def clean_avatar(self): 
     image = self.cleaned_data.get('image', None) 
     if not avatar: 
      raise forms.ValidationError('Missing image file') 
     try: 
      extension = os.path.splitext(image.name)[1][1:].lower() 
      if extension in self.ALLOWED_TYPES: 
       return avatar 
      else: 
       raise forms.ValidationError('File types is not allowed') 
     except Exception as e: 
      raise forms.ValidationError('Can not identify file type') 
Verwandte Themen