2012-06-16 9 views
40

पर तो मैं देखने के लिए इस कोड का उपयोग कर रहा है:निर्धारित करें यदि अपलोड की गई फ़ाइल छवि (किसी भी प्रारूप) MVC

<form action="" method="post" enctype="multipart/form-data"> 

    <label for="file">Filename:</label> 
    <input type="file" name="file" id="file" /> 

    <input type="submit" /> 
</form> 

यह मॉडल के लिए: जब तक कि उपयोगकर्ता एक जोड़ने

[HttpPost] 
public ActionResult Index(HttpPostedFileBase file) { 

    if (file.ContentLength > 0) { 
    var fileName = Path.GetFileName(file.FileName); 
    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
    file.SaveAs(path); 
    } 

    return RedirectToAction("Index"); 
} 

बढ़िया काम करता है फ़ाइल जो एक छवि नहीं है। मैं अपलोड की गई फाइल को कैसे आश्वस्त कर सकता हूं एक छवि है। धन्यवाद

+0

छवि प्रारूप का एक बहुत देखते हैं। –

+0

@ डैनियलए। व्हाइट यह मेरे प्रश्न का बिल्कुल सही बिंदु है। यह निर्धारित करें कि यह कोई छवि प्रारूप है लेकिन सभी के बाद एक छवि है। –

+1

आप सत्यापन के प्राथमिक रूप के रूप में 'फ़ाइल' के' ContentType' को देख सकते हैं। यदि यह पर्याप्त नहीं है, तो आप फ़ाइल स्ट्रीम के "हेडर" पर आज़माकर देख सकते हैं और देख सकते हैं कि यह आपके द्वारा समर्थित किसी भी प्रकार की छवियों से मेल खाता है या नहीं, ala http://stackoverflow.com/questions/210650/validate -image-from-file-in-c-sharp – HackedByChinese

उत्तर

73

मामले यह कर सकते हैं में किसी को भी मदद करता है, यहाँ यह है कि अगर किसी दिए गए अपलोड की गई फ़ाइल एक छवि है की जाँच करता है HttpPostedFileBase के लिए एक स्थिर विधि है:

public static class HttpPostedFileBaseExtensions 
{ 
    public const int ImageMinimumBytes = 512; 

    public static bool IsImage(this HttpPostedFileBase postedFile) 
    { 
     //------------------------------------------- 
     // Check the image mime types 
     //------------------------------------------- 
     if (postedFile.ContentType.ToLower() != "image/jpg" && 
        postedFile.ContentType.ToLower() != "image/jpeg" && 
        postedFile.ContentType.ToLower() != "image/pjpeg" && 
        postedFile.ContentType.ToLower() != "image/gif" && 
        postedFile.ContentType.ToLower() != "image/x-png" && 
        postedFile.ContentType.ToLower() != "image/png") 
     { 
      return false; 
     } 

     //------------------------------------------- 
     // Check the image extension 
     //------------------------------------------- 
     if (Path.GetExtension(postedFile.FileName).ToLower() != ".jpg" 
      && Path.GetExtension(postedFile.FileName).ToLower() != ".png" 
      && Path.GetExtension(postedFile.FileName).ToLower() != ".gif" 
      && Path.GetExtension(postedFile.FileName).ToLower() != ".jpeg") 
     { 
      return false; 
     } 

     //------------------------------------------- 
     // Attempt to read the file and check the first bytes 
     //------------------------------------------- 
     try 
     { 
      if (!postedFile.InputStream.CanRead) 
      { 
       return false; 
      } 

      if (postedFile.ContentLength < ImageMinimumBytes) 
      { 
       return false; 
      } 

      byte[] buffer = new byte[512]; 
      postedFile.InputStream.Read(buffer, 0, 512); 
      string content = System.Text.Encoding.UTF8.GetString(buffer); 
      if (Regex.IsMatch(content, @"<script|<html|<head|<title|<body|<pre|<table|<a\s+href|<img|<plaintext|<cross\-domain\-policy", 
       RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Multiline)) 
      { 
       return false; 
      } 
     } 
     catch (Exception) 
     { 
      return false; 
     } 

     //------------------------------------------- 
     // Try to instantiate new Bitmap, if .NET will throw exception 
     // we can assume that it's not a valid image 
     //------------------------------------------- 

     try 
     { 
      using (var bitmap = new System.Drawing.Bitmap(postedFile.InputStream)) 
      { 
      } 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
     finally 
     { 
      postedFile.InputStream.Position = 0; 
     } 

     return true; 
    } 
} 

संपादित करें 2017/02/10: एक सुझाव संपादित के अनुसार, जोड़ा धारा को रीसेट करने के लिए अंत में एक बयान, ताकि हम इसे बाद में उपयोग कर सकें। स्थिर सहायक कक्षा में

+0

इन फ़ाइल प्रकारों के लिए आपका क्या विचार है: '" .pdf "," .doc "," .docx "," .xls "," .xlsx "," .ppt "," .pptx "," .pps ", ".ppsx" 'कृपया, कृपया। –

+0

फ़ाइल एक्सटेंशन को सत्यापित करने के अलावा, आप पहले बाइट्स को भी मान्य कर सकते हैं (उदाहरण के लिए http: // serverfault देखें।com/प्रश्न/338,087/बनाने libmagic-फ़ाइल-पता लगाने-docx-फ़ाइलें/377,792 # 377,792)। इस संबंध में, कृपया ध्यान दें कि वे संकुचित ज़िप हैं (इसलिए माइम-प्रकार) फ़ाइलों को याद रखें, जो आपको एक एक्सएमएल देता है, आप इस एक्सएमएल प्रारूप को सत्यापित करने का प्रयास कर सकते हैं, हालांकि मुझे लगता है कि यह छवि सत्यापन के विपरीत कठिन होगा ऊपर। एक विचार जो काम कर सकता है Office COM का उपयोग करना है और यह देखने के लिए दस्तावेज़ों को लोड करने का प्रयास करें कि आपको कोई त्रुटि मिली है या नहीं। यह दृष्टिकोण, हालांकि, सभी वातावरण में काम नहीं करेगा। – OzB

+1

महान जवाब, धन्यवाद! –

12

हाथ में संकलक है नहीं, लेकिन कुछ इस तरह करना चाहिए:

try 
{ 
    var bitmap = Bitmap.FromStream(file.InputStream); 
    // valid image stream 
} 
catch 
{ 
    // not an image 
} 
0

पहले कदम के रूप, आप ContentType संपत्ति के खिलाफ स्वीकार्य MIME प्रकार के चारों ओर एक सफेद सूची होना चाहिए।

+2

वह तैयार किए गए अनुरोधों के लिए काम नहीं करेगा जहां माइम प्रकार स्ट्रीम सामग्री से मेल नहीं खाता है। –

7

उपयोग:

public static bool IsImage(HttpPostedFileBase postedFile) 
    { 
     try { 
       using (var bitmap = new System.Drawing.Bitmap(postedFile.InputStream)) 
        {       
          return !bitmap.Size.IsEmpty; 
        } 
       } 
       catch (Exception) 
       { 
        return false; 
       } 
      } 
    } 

ASP.NET MVC viewmodel में उपयोग:

public class UploadFileViewModel 
    { 
     public HttpPostedFileBase postedFile { get; set; } 

     public bool IsImage() 
     { 
      try { 
        using (var bitmap = new System.Drawing.Bitmap(this.postedFile.InputStream)) 
         {       
           return !bitmap.Size.IsEmpty; 
         } 
        } 
        catch (Exception) 
        { 
         return false; 
        } 
       } 
     } 
    } 

यह उदाहरण देखने के लिए कि क्या छवि एक वास्तविक छवि है की जाँच करता है, और आप संशोधित कर सकते हैं और इसे परिवर्तित करें

यह स्मृति को छः लीटर वी 8 के उदाहरण के रूप में खाता है, इसलिए इसका उपयोग तब किया जाना चाहिए जब आप वास्तव में यह जानना चाहते हैं कि यह छवि क्या है।

+1

कृपया थोड़ा सा स्पष्टीकरण भी प्रदान करें। : डी –

+0

ठीक है, मुझे इस – TheZodchiy

+1

के बारे में याद दिलाने के लिए धन्यवाद, मुझे लगता है कि यह एकमात्र समाधान है जिसे विश्वसनीय किया जा सकता है – MonsterMMORPG

-2
सर्वर साइड में

सामग्री प्रकार के साथ तुलना करें अगर आपके लिए आवश्यक अपलोड प्रारूप के साथ अपने मिलान तो आगे बढ़ना या फिर त्रुटि संदेश

+0

यह उपयोगकर्ताओं को अन्य MIME प्रकारों को चुनने से प्रतिबंधित नहीं करेगा। – refactor

7

लौट किसी को भी है कि इस में चलाता है।

सामग्री प्रकार/छवि के प्रकार की जांच करने के लिए आप file.ContentType.Contains("image") का भी उपयोग कर सकते हैं।

if(file.ContentLength > 0 && file.ContentType.Contains("image")) 
{ 
    //valid image 
} 
else 
{ 
    //not a valid image 
} 

अगर यह सबसे अच्छा अभ्यास है, लेकिन यह मेरे लिए काम करता सुनिश्चित नहीं हैं।

और अधिक क्लीनर रास्ते में
0

कार्यान्वयन,

public static class FileExtensions 
{ 
    private static readonly IDictionary<string, string> ImageMimeDictionary = new Dictionary<string, string> 
    { 
     { ".bmp", "image/bmp" }, 
     { ".dib", "image/bmp" }, 
     { ".gif", "image/gif" }, 
     { ".svg", "image/svg+xml" }, 
     { ".jpe", "image/jpeg" }, 
     { ".jpeg", "image/jpeg" }, 
     { ".jpg", "image/jpeg" }, 
     { ".png", "image/png" }, 
     { ".pnz", "image/png" } 
    }; 

    public static bool IsImage(this string file) 
    { 
     if (string.IsNullOrEmpty(file)) 
     { 
      throw new ArgumentNullException(nameof(file)); 
     } 

     var extension = Path.GetExtension(file); 
     return ImageMimeDictionary.ContainsKey(extension.ToLower()); 
    } 
} 
संबंधित मुद्दे