アップロードされたファイルのMIMEタイプをスニッフィングするためにFindMimeFromData
fromを使用しています。Internet ExplorerのMIMEタイプ検出にurlmon.dll
よると、は認識されているMIMEタイプの1つです。私の開発マシン(Windows 7 64ビット、IE9)では正常に動作しますが、テスト環境(Windows Server 2003 R2 64ビット、IE8)では動作しません-の代わりに戻ります。image/tiff
application/octet-stream
image/tiff
上記の記事では、MIMEタイプを判別するために実行する正確な手順について説明していますが、これimage/tiff
は26の認識されたタイプの1つであるため、ステップ2(実際のデータをスニッフィング)で終了する必要があります。これにより、ファイル拡張子と登録済みアプリケーション(およびその他のレジストリ関連のもの)が関係ありません。
ちなみに、TIFFファイルは実際にはテストサーバー上のプログラム(Windows画像とFAXビューア)に関連付けられています。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);
// ...
}