4

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

4

5 回答 5

4

这是对您发布的后续问题的快速而肮脏的回应:

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;
    }
}
于 2008-10-29T01:21:06.307 回答
2

这确实是 Unixfile程序所做的,具有或多或少的可靠性。在某种程度上,这取决于您尝试检测其文件的程序是否发出文件头;该计划tar因不这样做而臭名昭著。这取决于您计划尝试识别的文件类型,但使用 ; 的实现可能是最简单的file。它可以识别许多文件类型,并且现代版本可以通过可以处理多种场景的额外文件类型定义文件进行扩展。

于 2008-10-28T23:01:42.813 回答
1

文件的前几个字节通常会告诉您文件类型。例如,
参见 http://www.garykessler.net/library/file_sigs.html
http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html

上传后使用 System.IO 将字节读取为二进制。

不过,我很好奇,为什么不能依赖 ContentType 标头?

于 2008-10-28T23:00:07.107 回答
1

Wotsit是查找各种文件类型的幻数的好资源。

于 2008-10-28T23:31:50.880 回答
-1

读取文件的内容是万无一失的方法。由于您是在 .Net 中构建它,因此您可能会检查上传文件的 MIME 类型。

你可以通过 DllImport urlmon.dll 来帮助。请参考以下帖子: http ://coding-passion.blogspot.com/2008/11/validating-file-type.html

为了澄清内容类型,它总是由文件的扩展名驱动。因此,即使将 .zip 文件的扩展名重命名为 .txt,内容类型仍会显示纯文本。

于 2008-11-21T00:30:00.243 回答