2010-05-13 7 views
6

मेरे पास वर्कफ़्लो है जहां उपयोगकर्ता को कोई भी फ़ाइल अपलोड करने की अनुमति है और फिर वह फ़ाइल पढ़ी जाएगी।सी # का उपयोग कर फ़ाइल के एक्सटेंशन/प्रकार की पहचान कैसे करें?

अब मेरा प्रश्न यह है कि यदि उपयोगकर्ता के पास छवि फ़ाइल xyz.jpg है और उसने इसे केवल xyz (एक्सटेंशन हटा दिया गया) में बदल दिया है, तो हम अभी भी फ़ाइल डेटा/मेटाडेटा का उपयोग करके फ़ाइल का प्रकार/एक्सटेंशन प्राप्त कर सकते हैं।

धन्यवाद सभी

+2

उन्हें कोई विस्तार के साथ फाइल अपलोड न दें! :) – JohnIdol

+1

संभावित डुप्लिकेट [.NET का उपयोग करके, आप फाइल हस्ताक्षर के आधार पर फ़ाइल का माइम प्रकार कैसे प्राप्त कर सकते हैं एक्सटेंशन नहीं। ] (http://stackoverflow.com/questions/58510/using-net-how-can-you-find-the-mime-type-of-a-file-based-on-the-file-ignature) –

+0

I सहमत हैं - एक्सटेंशन के बिना फाइलें उपयोगकर्ता के लिए संदिग्ध मूल्य हैं, उन्हें क्या लगता है कि वे आपके लिए अधिक मूल्यवान होंगे? यह व्यवहार की उम्मीद नहीं है और आपके हिस्से पर अतिरिक्त जटिलता उत्पन्न नहीं करनी चाहिए। –

उत्तर

11

और अधिक विस्तार के लिए PInvoke.net देखें

[DllImport("urlmon.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = false)] 
    static extern int FindMimeFromData(IntPtr pBC, 
      [MarshalAs(UnmanagedType.LPWStr)] string pwzUrl, 
     [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.I1, SizeParamIndex=3)] 
     byte[] pBuffer, 
      int cbSize, 
      [MarshalAs(UnmanagedType.LPWStr)] string pwzMimeProposed, 
      int dwMimeFlags, 
      out IntPtr ppwzMimeOut, 
      int dwReserved); 

नमूना उपयोग:

public string MimeTypeFrom(byte[] dataBytes, string mimeProposed) { 
    if (dataBytes == null) 
    throw new ArgumentNullException("dataBytes"); 
    string mimeRet = String.Empty; 
    IntPtr suggestPtr = IntPtr.Zero, filePtr = IntPtr.Zero, outPtr = IntPtr.Zero; 
    if (mimeProposed != null && mimeProposed.Length > 0) { 
    //suggestPtr = Marshal.StringToCoTaskMemUni(mimeProposed); // for your experiments ;-) 
    mimeRet = mimeProposed; 
    } 
    int ret = FindMimeFromData(IntPtr.Zero, null, dataBytes, dataBytes.Length, mimeProposed, 0, out outPtr, 0); 
    if (ret == 0 && outPtr != IntPtr.Zero) { 
    //todo: this leaks memory outPtr must be freed 
    return Marshal.PtrToStringUni(outPtr); 
    } 
    return mimeRet; 
} 

// call it this way: 
Trace.Write("MimeType is " + MimeTypeFrom(Encoding.ASCII.GetBytes("%PDF-"), "text/plain")); 

एक और उदाहरण:

/// <summary> 
/// Ensures that file exists and retrieves the content type 
/// </summary> 
/// <param name="file"></param> 
/// <returns>Returns for instance "images/jpeg" </returns> 
public static string getMimeFromFile(string file) 
{ 
    IntPtr mimeout; 
    if (!System.IO.File.Exists(file)) 
    throw new FileNotFoundException(file + " not found"); 

    int MaxContent = (int)new FileInfo(file).Length; 
    if (MaxContent > 4096) MaxContent = 4096; 
    FileStream fs = File.OpenRead(file); 


    byte[] buf = new byte[MaxContent];   
    fs.Read(buf, 0, MaxContent); 
    fs.Close(); 
    int result = FindMimeFromData(IntPtr.Zero, file, buf, MaxContent, null, 0, out mimeout, 0); 

    if (result != 0) 
    throw Marshal.GetExceptionForHR(result); 
    string mime = Marshal.PtrToStringUni(mimeout); 
    Marshal.FreeCoTaskMem(mimeout); 
    return mime; 
} 
2

हाँ, शायद कई फ़ाइल प्रकारों के लिए यह संभव है, लेकिन यह दर मामले के आधार द्वारा एक मामले पर फ़ाइल की बाइनरी सामग्री की पार्स की आवश्यकता होगी।

3

आप urlmon.dll में अप्रबंधित फ़ंक्शन FindMimeFromData का उपयोग कर सकते हैं।

using System.Runtime.InteropServices; 

[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)] 
private extern static System.UInt32 FindMimeFromData(
    System.UInt32 pBC, 
    [MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl, 
    [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer, 
    System.UInt32 cbSize, 
    [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed, 
    System.UInt32 dwMimeFlags, 
    out System.UInt32 ppwzMimeOut, 
    System.UInt32 dwReserverd 
); 

उदाहरण के उपयोग के लिए here देखें।

+0

+1 - बहुत अच्छा, इसके बारे में नहीं पता था। क्या आपको लगता है कि HttpPostedFile के ContentType को परामर्श करके सेट किया गया है? इसके अलावा - एक कोड नमूना के साथ एक और क्यू मिला: http://stackoverflow.com/questions/58510/using-net-how-can-you-find-the-mime-type-of-a-file-based-on- फ़ाइल-हस्ताक्षर –

+0

@Andras पोस्ट की गई सामग्री का सामग्री प्रकार पोस्टर (कोड, ब्राउज़र, फ़्लैश इत्यादि) द्वारा मनमाने ढंग से सेट किया गया है और जब तक आपके पास कड़े नियंत्रित वातावरण नहीं है तब तक निर्भर नहीं किया जाता है। –

+0

मैंने देखा कि तुरंत और हटाया गया। ;-) और दूसरे बिंदु पर भी सहमत हुए। –

0

वहाँ विशिष्ट फ़ाइल स्वरूपों आप पता लगाने के लिए की जरूरत है? यह कार्य को बहुत आसान बनाता है यदि आप इसे कुछ प्रारूपों तक सीमित कर सकते हैं जिन्हें फ़ाइल की सामग्री द्वारा पहचाना जा सकता है।

यदि आपको फ़ाइल प्रकारों की एक विस्तृत श्रृंखला का पता लगाने की आवश्यकता है, तो आप तृतीय पक्ष टूलकिट्स का उपयोग कर सकते हैं, लेकिन मैं आपको चेतावनी दूंगा कि वे बहुत महंगा हैं। मैं परिचित हूं Stellent's (now Oracle's) Outside In, और Autonomy Keyview हैं। दोनों प्रोग्रामर टूलकिट प्रदान करते हैं।

0

तुम सिर्फ अगर अपलोड की गई फ़ाइल एक छवि है यह देखने के लिए की जरूरत है, बस इसे पार्स तदनुसार

try 
{ 
Image image = Bitmap.FromStream(fileData); 
} 
catch(Exception e) 
{ 
    // this isn't an image. 
} 
संबंधित मुद्दे