2015-10-13 2 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; 
     } 
    } 
} 

, к сожалению, это возвращая недействительный MIME, даже если я знаю, что он действителен (т.е. я загружаю действительное изображение .png, но получаю недействительный возврат)

любые предложения о том, где я ошибаюсь?

ответ

0

Согласно документации FindMimeFromData (MSDN):.

При загрузке файлов с клиента на веб-сервер, Windows Internet Explorer использует FindMimeFromData, чтобы определить тип MIME Где это возможно, FindMimeFromData возвращает жестко значения из списка известных типов MIME вместо того, чтобы полагаться на значение типа MIME , связанное с расширением имени файла в системном реестре. В некоторых случаях обнаруженный тип MIME может отличаться от общепринятого значения для обратной совместимости ти, как показано в следующей таблице :

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

Я хотел бы предложить для проверки мим == "изображения/X-PNG", а также.

+0

Замечательный ответ - я получил типы из списка, который имел «.x-png» в качестве расширения файла, но все еще имел тип mime как «image/png». добавили «image/x-png» в качестве типа mime для проверки, и он работает. спасибо за помощь – Dave

Смежные вопросы