2013-03-11 6 views
6

Ich habe meine ControllerÜberprüfen Sie, ob hochgeladene Datei ist ein Bild in C# ASP.NET MVC

[HttpPost] 
public ActionResult ChangeAvatar(HttpPostedFileBase file) 
{ 
    AvatarHelper.AvatarUpdate(file, User.Identity.Name); 
    return RedirectToAction("Index", "Profile"); 
} 

Und ich prüfen bereits, ob die Datei in JPEG ist/PNG-Format:

private static bool IsImage(string contentType) 
{ 
    return AllowedFormats.Any(format => contentType.EndsWith(format, 
      StringComparison.OrdinalIgnoreCase)); 
} 

public static List<string> AllowedFormats 
{ 
    get { return new List<string>() {".jpg", ".png", ".jpeg"}; } 
} 

Was ich brauche, - es stellt sicher, dass die hochgeladene Datei eine echte Bilddatei und keine TXT-Datei mit Bild-Erweiterung ist.

ich meine hochgeladenen Datei wie folgt konvertieren:

using (var image = System.Drawing.Image.FromStream(postedFile.InputStream)) 
{ 
      ///image stuff 
} 

ich über Block try/catch denke ich auf das Bild aus dem Eingangsstrom erzeugt, aber ich frage mich, ob es eine gute Möglichkeit, es zu tun ist? Danke)

P.S.

Ich frage mich, ob es eine andere (effizientere Art und Weise, versuchen/fangen Block) Weg, um zu überprüfen, ob die Datei ein echtes Bild ist?

+0

try/fangen sollte gut funktionieren. Fragst du, ob das eine schlechte Idee ist oder ob es einen besseren Weg gibt? Nicht sicher, was deine Frage ist. Hast du die try/catch-Methode ausprobiert und es hat nicht wie erwartet funktioniert oder was? –

+0

Versuch/Fang funktioniert gut. Ich frage mich nur, ob es einen effizienteren Weg gibt, es zu tun. – makambi

+0

überprüfen Sie den Mimetyp, wenn es image/octet-stream ist –

Antwort

4

Sie konnten die RawFormat Eigenschaft:

private static ImageFormat[] ValidFormats = new[] { ImageFormat.Jpeg, ImageFormat.Png }; 
public bool IsValid(Stream image) 
{ 
    try 
    { 
     using (var img = Image.FromStream(file.InputStream)) 
     { 
      return ValidFormats.Contains(img.RawFormat); 
     } 
    } 
    catch 
    { 
     return false; 
    } 
} 

Auch könnten Sie diese Validierungslogik in eine wiederverwendbare Validierung Attribut setzen, wie ich in this post gezeigt haben.

+0

yep, wie ich oben schrieb ich bereits tun. ist die Frage: gibt es eine andere Möglichkeit als versuchen/catch Block, um herauszufinden, wo eingehende Datei Bild und nicht nur zufällige Datei mit Bild-Erweiterung ist? – makambi

+0

Ja, da ist. Sie könnten den Stream lesen und Heuristiken verwenden, um festzustellen, ob das Format eines der unterstützten Bildformate ist. Sie müssen jede Bildformatspezifikation, die Sie unterstützen möchten, lesen und die Überschriften erkennen können. Es wird jedoch eine Menge Arbeit sein. –

+0

danke für die referenz für modell attribut) es ist hilfreich) – makambi

2

Meine Lösung als Erweiterung, die Überprüfung eigentlich, wenn ein Base64-String ein Bild ist oder nicht:

public static bool IsImage(this string base64String) 
    { 
     byte[] imageBytes = Convert.FromBase64String(base64String); 

     var stream = new MemoryStream(imageBytes, 0, imageBytes.Length); 
     try 
     { 
      stream.Write(imageBytes, 0, imageBytes.Length); 
      System.Drawing.Image image = System.Drawing.Image.FromStream(stream, true); 
      return true; 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 

Verbrauch:

if(!"base64string".IsImage()) 
    throw new Exception("Not an image"); 
Verwandte Themen