2011-07-09 394 views
1

在ASP.NET的文件上傳控制中驗證文件格式的最佳方式是什麼? 其實我想讓那個用戶只上傳特定格式的文件。雖然我通過檢查文件名來驗證它,但我正在尋找另一種解決方案來解決這個問題。文件上傳asp.net

+0

你打算接受哪種格式? – Andomar

+0

我想上傳Packet Tracer文件.pkt – SMK

回答

1

請嘗試下面的代碼,它從文件中讀取前256個字節,並使用內部dll(urlmon.dll)返回該文件的mime類型。然後比較解析後文件的MIME類型和返回的MIME類型。

 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 
     ); 

     public string getMimeFromFile(string filename) 
     { 
      if (!File.Exists(filename)) 
      throw new FileNotFoundException(filename + " not found"); 

      byte[] buffer = new byte[256]; 
      using (FileStream fs = new FileStream(filename, FileMode.Open)) 
      { 
       if (fs.Length >= 256) 
        fs.Read(buffer, 0, 256); 
       else 
       fs.Read(buffer, 0, (int)fs.Length); 
      } 
     try 
     { 
      System.UInt32 mimetype; 
      FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0); 
      System.IntPtr mimeTypePtr = new IntPtr(mimetype); 
      string mime = Marshal.PtrToStringUni(mimeTypePtr); 
      Marshal.FreeCoTaskMem(mimeTypePtr); 
      return mime; 
    } 
    catch (Exception e) 
    { 
     return "unknown/unknown"; 
    } 
    } 

但在不同的瀏覽器中檢查類型,因爲mimetype可能在不同的瀏覽器中有所不同。

此外,即使您通過編輯文件的名稱更改了擴展名,也會給出確切的mimetype。

希望這可以幫助你...

+0

對不起,但IAM looikng轉發驗證從客戶端。 – SMK

+0

@Shoaib,我也搜索了一些simillar作爲您的要求,可以找到一個。最後我只檢查了客戶端的擴展,並使用上面的代碼進行了服務器端驗證。 urlmon.dll是dotnet庫中的一個內部DLL,只需要添加它的引用.. – Harun

+0

Thanx to All。我喜歡解決方案,通過簡單的使用正則表達式驗證器,並檢查我的擴展模式應該匹配:) – SMK

1

要確定的唯一方法是根據文件格式的規範實際解析整個文件,並檢查一切是否合適。

如果您只想進行基本檢查,大多數二進制文件格式在開頭都有某種形式的標頭或magic number,您可以檢查。

0

您可以使用像Uploadify這樣的組件來限制用戶在上傳前可以選擇哪種類型的文件。

+0

好吧,讓我檢查 – SMK