Я использую FindMimeFromData
из urlmon.dll
для прослушивания загруженных файлов MIME-типа. Согласно Обнаружение типов MIME в Internet Explorer , image/tiff
является одним из распознанных типов MIME. Он отлично работает на моей машине для разработки (Windows 7 64bit, IE9), но не работает в тестовой среде (Windows Server 2003 R2 64bit, IE8) - он возвращает application/octet-stream
вместо image/tiff
.
В вышеприведенной статье описываются точные шаги, предпринятые для определения типа MIME, но, поскольку image/tiff
является одним из 26 распознанных типов, он должен заканчиваться на шаге 2 (прослушивание фактических данных), чтобы расширения файлов и зарегистрированные приложения (и другие материалы реестра) не должны иметь значения.
Да, кстати, файлы TIFF на самом деле связаны с программой (Windows Picture and Fax Viewer) на тестовом сервере. Дело не в том, что в реестре Windows нет ссылок на TIFF.
Есть идеи, почему это не работает, как ожидалось?
РЕДАКТИРОВАТЬ: FindMimeFromData используется следующим образом:
public class MimeUtil
{
[DllImport("urlmon.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = false)]
private 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 static string GetMimeFromData(byte[] data)
{
IntPtr mimetype = IntPtr.Zero;
try
{
const int flags = 0x20; // FMFD_RETURNUPDATEDIMGMIMES
int res = FindMimeFromData(IntPtr.Zero, null, data, data.Length, null, flags, out mimetype, 0);
switch (res)
{
case 0:
string mime = Marshal.PtrToStringUni(mimetype);
return mime;
// snip - error handling
// ...
default:
throw new Exception("Unexpected HRESULT " + res + " returned by FindMimeFromData (in urlmon.dll)");
}
}
finally
{
if (mimetype != IntPtr.Zero)
Marshal.FreeCoTaskMem(mimetype);
}
}
}
, который затем называется так:
protected void uploader_FileUploaded(object sender, FileUploadedEventArgs e)
{
int bsize = Math.Min(e.File.ContentLength, 256);
byte[] buffer = new byte[bsize];
int nbytes = e.File.InputStream.Read(buffer, 0, bsize);
if (nbytes > 0)
string mime = MimeUtil.GetMimeFromData(buffer);
// ...
}