如何在不使用扩展程序的情况下可靠地验证上传文件的类型?我猜你必须检查标题/读取一些字节,但我真的不知道如何去做。我正在使用c#和asp.net。
感谢您的任何建议。
好的,所以从上面的链接我现在知道我正在寻找'ff d8 ff e0'来肯定地识别一个.jpg文件。
在我的代码中我可以读出前20个字节没问题:
FileStream fs = File.Open(filePath, FileMode.Open);
Byte[] b = new byte[20];
fs.Read(b, 0, 20);
所以(请原谅我在这里完全缺乏经验),但如何检查字节数组是否包含'ff d8 ff e0'?
答案 0 :(得分:3)
以下是对您发布的跟进问题的快速反应:
byte[] jpg = new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 };
bool match = true;
for (int i = 0; i < jpg.Length; i++)
{
if (jpg[i] != b[i])
{
match = false;
break;
}
}
答案 1 :(得分:2)
这确实是Unix file
程序所做的事情,具有更高或更低程度的可靠性。在某种程度上,它取决于您尝试检测其文件的程序是否发出文件头;程序tar
因不这样做而臭名昭着。这取决于您计划尝试和识别的文件类型,但最简单的方法是使用file
的实现;它可识别多种文件类型,现代版本可通过可处理多种方案的额外文件类型定义文件进行扩展。
答案 2 :(得分:1)
文件的前几个字节通常会告诉您文件类型。例如,见,
http://www.garykessler.net/library/file_sigs.html
http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html
使用System.IO在上传后将二进制读取为二进制文件。
我很好奇,为什么你不能依赖于ContentType标题?
答案 3 :(得分:1)
Wotsit是查找各种文件类型的幻数的好资源。
答案 4 :(得分:0)
阅读文件内容是一种万无一失的方法。由于您在.Net中构建它,您可以检查上传文件的MIME类型。
您可以通过DllImport urlmon.dll来提供帮助。请参考以下帖子: http://coding-passion.blogspot.com/2008/11/validating-file-type.html
为了澄清Content-type,它总是由文件的扩展驱动。因此,即使.zip文件将其扩展名重命名为.txt,内容类型仍将仅显示文本。