2008-10-28 41 views
4

如何在不使用擴展的情況下可靠地驗證上傳文件的類型?我猜你必須檢查頭部/讀取一些字節,但我真的不知道該怎麼去做。我使用C#和ASP.NET。如何檢查上傳文件的內容而不依賴其擴展名?

感謝您的任何建議。


好了,從上面的鏈接我現在知道,我找「FF FF D8 E0」來正確識別,例如.jpg文件。

在我的代碼,我可以讀頭二字節沒有問題:

   FileStream fs = File.Open(filePath, FileMode.Open); 
       Byte[] b = new byte[20]; 
       fs.Read(b, 0, 20); 

左右(並請在此處原諒我總經驗不足),但我怎麼檢查字節數組中是否包含「FF D8 FF E0」 ?

回答

3

下面就來您發佈的後續問題的快速和骯髒的響應:

byte[] jpg = new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 }; 
bool match = true; 
for (int i = 0; i < jpg.Length; i++) 
{ 
    if (jpg[i] != b[i]) 
    { 
     match = false; 
     break; 
    } 
} 
2

這確實是Unix程序所做的事情,具有更高或更低程度的可靠性。部分取決於您嘗試檢測文件的程序是否發出文件頭;程序tar因不這樣做而臭名昭着。這取決於您打算嘗試和識別的文件類型,但最好使用file的實現;它可以識別許多文件類型,現代版本可通過額外的文件類型定義文件進行擴展,這些文件類型定義可以處理多種場景。

1

Wotsit是找出各種文件類型的神奇數字的好資源。

0

讀取文件的內容是傻瓜證明的方式。由於您使用的是.Net,因此您可以檢查上傳文件的MIME類型。

你可以通過DllImport urlmon.dll來獲得幫助。請參考以下文章: http://coding-passion.blogspot.com/2008/11/validating-file-type.html

爲了澄清有關內容類型,它總是由文件的擴展驅動。所以即使一個.zip文件的擴展名被重命名爲.txt,內容類型仍然只會顯示文本。