2010-11-19 16 views
15

Ich habe folgendes:jQuery - INPUT Typ = Datei, Image FileType Validierungsoptionen?

<input id="user_profile_pic" name="user[profile_pic]" type="file"> 

Auf dem Server ich überprüfen, um sicherzustellen, dass es ein Bild ist, aber ich möchte zunächst auf der Clientseite überprüfen.

Wie kann ich mit jQuery den Benutzer warnen, wenn die ausgewählte Eingabedatei kein gif, jpg, png oder bmp ist?

Dank

Antwort

26

Sie möchten zu überprüfen, was der Wert des Elements ist, etwas entlang der Linien von:

$("#user_profile_pic").change(function() { 

    var val = $(this).val(); 

    switch(val.substring(val.lastIndexOf('.') + 1).toLowerCase()){ 
     case 'gif': case 'jpg': case 'png': 
      alert("an image"); 
      break; 
     default: 
      $(this).val(''); 
      // error message here 
      alert("not an image"); 
      break; 
    } 
}); 

bearbeiten

verän-Code basierend auf Kommentar - entfernt nun den Wert der ausgewählten Datei wenn nicht ein Bild.

+0

Uncaught TypeError: Objekt # hat keine Methode 'onchange' – AnApprentice

+0

.change funktioniert. Aber es ist immer noch nicht gut, da es zwar Fehler macht, es aber trotzdem auswählt und die Datei auf der Seite anzeigt. – AnApprentice

+0

Das Hinzufügen funktionierte, ".val ('');" aber ich weiß nicht, wie konform das ist ... irgendjemand? – AnApprentice

7

könnten Sie einen regulären Ausdruck verwenden:

var val = $("#user_profile_pic").val(); 
if (!val.match(/(?:gif|jpg|png|bmp)$/)) { 
    // inputted file path is not an image of one of the above types 
    alert("inputted file path is not an image!"); 
} 

Natürlich könnte man mehr Formate zu dem regulären Ausdruck hinzuzufügen. Es gibt komplexere und umfassendere Möglichkeiten, dies zu erreichen, aber diese Methode wird die Aufgabe erfüllen, solange der eingegebene Bilddateipfad in einer Standardbilddateierweiterung endet.

+0

Was passiert, wenn es drei Eingabedateien sind, und ich möchte, dass sie eins nach dem anderen zu validieren? 'var val1 = ...', 'var val2 = ...' 'var val3 = ...' 'if (! val.match (/ (?: gif | jpg | png | bmp) $ /)) { ' – alisa

1

Es kann Browser geben, mit denen Sie einen <img/> des angegebenen Pfads erstellen können, mit dem Sie überprüfen können, ob es ein echtes Bild ist oder nicht (wenn nicht das Onerror-Ereignis auf dem Bild ausgelöst werden soll und es eine Breite hat/Höhe von 0).

Aber da dies nur in einigen Browsern funktioniert und ein Sicherheitsrisiko darstellt (meiner Meinung nach) würde ich dies nicht empfehlen, daher lautet meine Antwort: Sie können dort nichts validieren.

Die Dateiendungen zu prüfen, wie von Alex vorgeschlagen, kann eine Option sein, aber die Dateierweiterung garantiert nicht, ob es ein Bild ist. Als eine einfache Vorprüfung (nicht Validierung) könnte es jedoch nützlich sein.

9

Es ist ziemlich einfach, benötigt keine JavaScript-Validierungen. Schreiben Sie das einfach und es akzeptiert nur Bilddateien.

<input type="file" multiple accept='image/*'> 
+2

das ist cool, aber es funktioniert nicht als Validierung! Es ist nur zur einfacheren Handhabung, ein Bild aus einem Ordner mit einer anderen Erweiterung auszuwählen. wie Sie hier sehen können -> http://imageshack.us/a/img20/8451/switchzz.jpg – bernte

+0

Eine Definition im HTML kann in einigen Browsern überschrieben werden, indem Sie im Dateidialog "Alle Dateien" wählen. Zwei, obwohl es an sich nicht zu 100% narrensicher ist, ist die Validierung mit JavaScript noch eine weitere Abschreckung im Kampf gegen bösartige Aktivitäten. Alles in allem möchten Sie, dass Ihr Backend validiert wird, bevor Sie es akzeptieren, und als zusätzlichen Bonus durch Überprüfen und Validieren der ersten paar Bytes der Datei, um es zu validieren, ist ein Typ, den Sie wirklich wollen, da allein durch Erweiterung nie ein narrensicheres Mittel ist. – chris

1

Wie können wir überprüfen, dass Benutzer wählt Bilddatei?

  • Durch Dateierweiterung Validierung
    Es ist wie erwartet, Textdatei mit .png Erweiterung passieren hier
  • input[type=file][accept=image/*] Es verbirgt sich zunächst non-image Dateien vom Benutzer. Aber dieser Filter funktioniert auch mit Erweiterungen. Der Benutzer kann weiterhin einen vorhandenen Dateinamen manuell eingeben.
  • Wir können Mime-Typ Ergebnis dataUrl überprüfen, es beginnt mit data:mimetype;base64,.... Also, wir brauchen image/* Mimetype.

    var file = $('#uploadfile'); 
    file.on('change', function (e) { 
        var reader = new FileReader(); 
    
        reader.onload = function() { 
         var data = reader.result; 
         if (data.match(/^data:image\//)) { 
          $('#thumbnail').attr('src', data); 
         } else { 
          console.error('Not an image'); 
         } 
        }; 
    
        reader.readAsDataURL(file.prop('files')[0]); 
    });