在ASP.NET中验证文件上传控件中的文件格式的最佳方法是什么? 实际上我希望该用户只上传具有特定格式的文件。虽然我通过检查文件名来验证它,但我正在寻找另一种解决方案。
答案 0 :(得分:1)
唯一可以确定的方法是根据文件格式的规范实际解析整个文件,并检查一切是否合适。
如果您只想进行基本检查,大多数二进制文件格式在其开头都有某种形式的标题或magic number,您可以检查。
答案 1 :(得分:1)
尝试以下代码从文件读取前256个字节,并使用内部dll(urlmon.dll)返回文件的mime类型。然后在解析后比较文件的mime类型和返回的mime类型。
using System.Runtime.InteropServices; ...
[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 string getMimeFromFile(string filename)
{
if (!File.Exists(filename))
throw new FileNotFoundException(filename + " not found");
byte[] buffer = new byte[256];
using (FileStream fs = new FileStream(filename, FileMode.Open))
{
if (fs.Length >= 256)
fs.Read(buffer, 0, 256);
else
fs.Read(buffer, 0, (int)fs.Length);
}
try
{
System.UInt32 mimetype;
FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
System.IntPtr mimeTypePtr = new IntPtr(mimetype);
string mime = Marshal.PtrToStringUni(mimeTypePtr);
Marshal.FreeCoTaskMem(mimeTypePtr);
return mime;
}
catch (Exception e)
{
return "unknown/unknown";
}
}
但请检查不同浏览器中的类型,因为mimetype在不同的浏览器中可能会有所不同。
即使您通过编辑文件名来更改扩展名,也会提供准确的mimetype。
希望这可以帮助你...
答案 2 :(得分:0)
您可以使用像Uploadify这样的组件来限制用户在上传之前可以选择的文件类型。