2015-10-13 57 views
0

我有一個用戶配置文件頁面,顯示用戶的頭像,並允許他們上傳一個新的。asp.net文件上傳檢查總是返回無效的MIME類型

當用戶點擊上傳時,我想在決定是否上傳之前檢查發佈文件的MIME類型。

這全部包含在父配置文件頁面內的用戶控件中。

我的用戶控制:

<asp:ImageButton ID="imgAvatar" runat="server" OnClick="imgAvatar_Click" /> 
    <asp:FileUpload ID="fluFileUpload" runat="server" AllowMultiple="false" /> 
    <asp:Button ID="btnFileUpload" runat="server" Text="Upload" OnClick="btnFileUpload_Click" /> 
    <asp:Button ID="btnCancelUpload" runat="server" Text="Cancel" OnClick="btnCancelUpload_Click" /> 

我的上傳按鈕後面的代碼:

protected void btnFileUpload_Click(object sender, EventArgs e) 
{ 
    if(fluFileUpload.HasFile) 
    { 
     HttpPostedFile avatar = fluFileUpload.PostedFile; 
     bool validmime = validUpload(avatar); 
     if (validmime) 
     { 
      //handling valid upload 
     } 
     else 
     { 
      //handling invalid upload 
     } 
    } 
    else 
    { 
     //handling no file 
    } 
} 

我檢查的MIME類型的處理程序:

[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 static bool validUpload (HttpPostedFile postedFile) 
    { 
     HttpPostedFile file = postedFile; 
     byte[] document = new byte[file.ContentLength]; 
     file.InputStream.Read(document, 0, file.ContentLength); 
     System.UInt32 mimetype; 
     FindMimeFromData(0, null, document, 256, null, 0, out mimetype, 0); 
     System.IntPtr mimeTypePtr = new IntPtr(mimetype); 
     string mime = Marshal.PtrToStringUni(mimeTypePtr); 
     Marshal.FreeCoTaskMem(mimeTypePtr); 

     if (mime == "image/png" || mime == "image/jpeg" || mime == "image/pjpeg") 
     { 
      //file is valid 
      return true; 
     } 
     else 
     { 
      //file is invalid 
      return false; 
     } 
    } 
} 

不幸的是,這是返回一個無效甚至當我知道它是有效的(即我正在上傳一個有效的.png圖像,但得到一個無效退貨)

有關我哪裏出錯的建議嗎?

回答

0

根據FindMimeFromData的文檔(MSDN)

當上傳從客戶端文件到Web服務器時,Windows Internet Explorer使用FindMimeFromData來確定MIME類型 如果可能的話,FindMimeFromData返回硬編碼 已知MIME類型列表中的值,而不是依賴與系統註冊表中的文件擴展名相關聯的MIME類型值 。在某些情況下,檢測到的MIME類型可能與通用的 接受的值不同(後向兼容性TY,如示於下表 :

 
Standard MIME TypeFindMimeFromData Returns 
image/jpeg  image/pjpeg 
image/png  image/x-png 

我建議檢查的mime == 「圖像/ X-PNG」 爲好。

+0

太棒了,這就是答案 - 我從列表中獲得了「.x-png」作爲文件擴展名,但仍然將MIME類型設置爲「image/png」的類型。已經添加了「image/x-png」作爲一個MIME類型來檢查它是否工作。非常感謝您的幫助 – Dave