2012-08-25 23 views
18

Ich habe einen Controller wie folgt aus:MVC3 Wie kann man überprüfen, ob HttpPostedFileBase ist ein Bild

public ActionResult Upload (int id, HttpPostedFileBase uploadFile) 
{ 
.... 
} 

Wie kann ich sicherstellen, dass upload ein Bild (jpg, png etc.)

ich versucht habe, mit

using (var bitmapImage = new Bitmap (uploadFile.InputStream)) {..} 

, die eine ArgumentException auslöst, wenn BitmapImage nicht erstellt werden kann.

Gibt es einen besseren Weg zum Beispiel, indem Sie uploadFile.FileName betrachten?

Antwort

55

können Sie überprüfen die HttpPostedFileBase Eigenschaften des Objekts für dieses

  • Content
  • Filename (überprüfen Sie die Dateierweiterungen, die Sie bereits kennen :))

enter image description here

Auch Hier ist eine kleine Methode, die ich vorbereitet habe, die Sie verwenden/erweitern können ...

private bool IsImage(HttpPostedFileBase file) 
{ 
    if (file.ContentType.Contains("image")) 
    { 
     return true; 
    } 

    string[] formats = new string[] { ".jpg", ".png", ".gif", ".jpeg" }; // add more if u like... 

    // linq from Henrik Stenbæk 
    return formats.Any(item => file.FileName.EndsWith(item, StringComparison.OrdinalIgnoreCase)); 
} 

Ich habe auch einen Artikel zu diesem here

+0

Thaks - Ich habe die foreach in: 'return formats.Any (item => file.FileName.Endswith (item, StringComparison.OrdinalIgnoreCase));' –

16

geschrieben Sie können den Dateinamen und die Erweiterung und MIME-Typ überprüfen, aber das ist vielleicht nicht zuverlässig sein, da der Benutzer einfach die Datei vor dem Hochladen umbenennen könnte. Hier ist ein zuverlässiger Weg, das zu erreichen, indem er den Inhalt der Datei suchen: https://stackoverflow.com/a/6388927/29407

Sie könnten natürlich erweitern, dies zu anderen bekannten Bildtyp Formate als PNG, wie folgt aus:

public class ValidateFileAttribute : RequiredAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var file = value as HttpPostedFileBase; 
     if (file == null) 
     { 
      return false; 
     } 

     if (file.ContentLength > 1 * 1024 * 1024) 
     { 
      return false; 
     } 

     try 
     { 
      var allowedFormats = new[] 
      { 
       ImageFormat.Jpeg, 
       ImageFormat.Png, 
       ImageFormat.Gif, 
       ImageFormat.Bmp 
      }; 

      using (var img = Image.FromStream(file.InputStream)) 
      { 
       return allowedFormats.Contains(img.RawFormat); 
      } 
     } 
     catch { } 
     return false; 
    } 
} 
+1

Ich denke, bringen die Beispiel-Code, sollten Sie wahrscheinlich habe die Einschränkung auf dem anderen Beitrag von "nicht mehr als 1 MB" durch Entfernen der 2. if-Anweisung entfernt - hilft nicht bei der Beantwortung dieser Frage. –

3

Oder Sie können überprüfen es auf Client-Seite durch hTML-Attribut ‚annehmen‘ so schnell wie möglich die Datei zu filtern:

@Html.TextBoxFor(x => x.HomeDeviceImage, new { @type = "file", @accept = "image/x-png, image/gif, image/jpeg" }) 

dies nur Dateitypen zeigt in Ihrem akzeptiert Attribut als Standard definiert werden. Hüten Sie sich vor, Benutzer noch filetye ändern „Alle Dateien“, mit diesem Hintergrund besser überprüfen Sie diese:

Solved concern , ein Javascript-Snippet-Erweiterung zu überprüfen, und dann einige Bearbeitung tun deaktivieren Taste wie:

  $('input:submit').attr('disabled', true); 

bis die Dateierweiterung korrekt ist. Trotzdem muss es auf der Serverseite überprüft werden. :)

Verwandte Themen