我知道以前有人问过这个问题,但两种解决方案都不适合我。我想知道上传到我的服务器(通过 .ashx)的文件是 .xlsx、.xls 还是 .csv 类型。
我尝试使用此处列出的幻数,但例如,如果我将 .msi 的扩展名更改为 .xls,则该文件将被识别为 .xls...以下代码说明了我所说的内容:
private bool IsValidFileType(HttpPostedFile file)
{
using (var memoryStream = new MemoryStream())
{
file.InputStream.CopyTo(memoryStream);
byte[] buffer = memoryStream.ToArray();
//Check exe and dll
if (buffer[0] == 0x4D && buffer[1] == 0x5A)
{
return false;
}
//Check xlsx
if (buffer.Length >= 3 &&
buffer[0] == 0x50 && buffer[1] == 0x4B &&
buffer[2] == 0x03 && buffer[3] == 0x04 ||
buffer[0] == 0x50 && buffer[1] == 0x4B &&
buffer[2] == 0x05 && buffer[3] == 0x06)
{
return true;
}
//Check xls
if (buffer.Length >= 7 &&
buffer[0] == 0xD0 && buffer[1] == 0xCF &&
buffer[2] == 0x11 && buffer[3] == 0xE0 &&
buffer[4] == 0xA1 && buffer[5] == 0xB1 &&
buffer[6] == 0x1A && buffer[7] == 0xE1)
{
return true;
}
return false;
}
}
然后我尝试使用urlmon.dll,类似于以下内容,但它仍然将文件识别为 .xls
[DllImport("urlmon.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = false)]
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);
我在想,也许我应该尝试使用一些库(例如ExcelDataReader)打开上传的文件,但我不确定这是否是最佳方法。
任何帮助,将不胜感激。
catspeake
胡子哥哥
翻阅古今
相关分类