文件 Mime 类型检查

问题描述 投票:0回答:6

我允许将文件上传到我的 C# MVC 网站,我目前根据扩展名限制这些类型,但我也觉得我需要服务器端检查以确认它们没有重命名。

是否有一种技术可以用来检查我需要的所有类型或我可以使用的库可以在这里提供帮助?

我见过有人检查文件的前几个字节,但我担心我会错过一些东西?

感谢您的帮助。

编辑:

这里有很多建议。我将调查其中一些作为解决方案。

c# asp.net-mvc file-upload mime-types
6个回答
3
投票
如果您将文件作为 HttpPostedFile 读取,您可以获得等于 mime 类型的内容类型。

那么您可以执行以下操作:

if (myFile.ContentType == "video/mpeg") { // Do your thing } else{ // error }
    

1
投票
尝试这个解决方案:

使用.NET,如何根据文件签名而不是扩展名找到文件的 mime 类型

它将为您嗅探文件内容。


0
投票
我最终混合了

here的一些解决方案,因为我没有使用HttpFileBase并且只有文件流,所以我必须读取流的前几个字节来确定mime类型。

注意:我不使用注册表技术,因为我不知道服务器上会或不会安装什么。


0
投票
您可以通过以下方式获取MIME类型:

var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'); mimeType = file.ContentType;

一旦获得MIME类型,就可以通过字符串比较来进行比较(如@ffffff01所示)


0
投票
为了更安全,您还可以使用

ContentType 属性检查 mimeType(如 ffffff01 所说),并使用 Path.GetExtension 方法检查文件扩展名。


0
投票

客户端

<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(); } }
    
© www.soinside.com 2019 - 2024. All rights reserved.