如何在不依赖其扩展名的情况下检查上传文件的内容?

时间:2008-10-28 22:56:50

标签: asp.net file-upload

如何在不使用扩展程序的情况下可靠地验证上传文件的类型?我猜你必须检查标题/读取一些字节,但我真的不知道如何去做。我正在使用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'?

5 个答案:

答案 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,内容类型仍将仅显示文本。