【发布时间】:2011-10-01 02:38:04
【问题描述】:
我正在使用来自urlmon.dll 的FindMimeFromData 来嗅探上传文件的 MIME 类型。根据MIME Type Detection in 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 图片和传真查看器)相关联。并不是说 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);
// ...
}
【问题讨论】:
-
放弃:IIS 正在使用什么?你有关联的 IIS MIME 类型吗?虽然 .tif 文件与一个程序相关联,但这并不意味着 MIME 类型已在 IIS 中注册
-
您是否将
pwzUrl或pBuffer参数与FindMimeFromData一起使用? -
@Aoi:我使用
pBuffer。我将使用实际代码更新问题。 -
@Daniel:IIS6 安装在该服务器上,并且定义了 .tif 和 .tiff 的 MIME 类型(图像/tiff),尽管我怀疑这对此有任何影响。这段代码 (
urlmon.dll) 是 IE 的一部分,可以在没有 IIS 的机器上使用,所以我看不出 IIS 版本或配置如何影响结果。 -
这是对所有 TIFF 文件失败还是仅对一个文件失败?否则,您确定 MIME 嗅探是测试机器上启用的 IE 功能(IE 区域也可以禁用此功能...)msdn.microsoft.com/en-us/library/ms537169(v=vs.85).aspx
标签: c# winapi mime-types mime urlmon