我允许将文件上传到我的 C# MVC 网站,我目前根据扩展名限制这些类型,但我也觉得我需要服务器端检查以确认它们没有重命名。
是否有一种技术可以用来检查我需要的所有类型或我可以使用的库可以在这里提供帮助?
我见过有人检查文件的前几个字节,但我担心我会错过一些东西?
感谢您的帮助。
编辑:
那么您可以执行以下操作:
if (myFile.ContentType == "video/mpeg")
{
// Do your thing
}
else{
// error
}
here的一些解决方案,因为我没有使用HttpFileBase并且只有文件流,所以我必须读取流的前几个字节来确定mime类型。
注意:我不使用注册表技术,因为我不知道服务器上会或不会安装什么。
var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
mimeType = file.ContentType;
一旦获得MIME类型,就可以通过字符串比较来进行比较(如@ffffff01所示)
ContentType 属性检查 mimeType(如 ffffff01 所说),并使用 Path.GetExtension 方法检查文件扩展名。
客户端
<asp:FileUpload runat="server" ID="fileUploader" accept=".pdf,.docx"/>
<asp:RegularExpressionValidator ID="fileUploaderV" runat="server" ControlToValidate="fileUploader" ErrorMessage="Only .pdf, .docx formats are allowed"
ValidationExpression="(.+\.([Pp][Dd][Ff])|.+\.([Dd][Oo][Cc][Xx]))" Display="Dynamic" ForeColor="Red"></asp:RegularExpressionValidator>
服务器端
using System.Runtime.InteropServices;
[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);
public static string getMimeFromFile(HttpPostedFile file)
{
IntPtr mimeout;
int MaxContent = (int)file.ContentLength;
if (MaxContent > 4096) MaxContent = 4096;
byte[] buf = new byte[MaxContent];
file.InputStream.Read(buf, 0, MaxContent);
int result = FindMimeFromData(IntPtr.Zero, file.FileName, buf, MaxContent, null, 0, out mimeout, 0);
if (result != 0)
{
Marshal.FreeCoTaskMem(mimeout);
return "";
}
string mime = Marshal.PtrToStringUni(mimeout);
Marshal.FreeCoTaskMem(mimeout);
return mime.ToLower();
}
}