是否可以验证发布的文件是否为pdf?

时间:2013-04-15 11:33:55

标签: c# asp.net pdf

守护网站的主要工作是接受用户的文件并保存。直到2个月之后,当我被告知要强制执行约束以仅接受pdf文件时,每件事都很好。

之前用户习惯提交各种格式的文本,rtf到好的PDF格式。

我通过检查文件扩展名来应用约束 - 简单吗?但是,当管理员检查这些文件时,有60%的文件已损坏。

我花了很多不眠之夜来确定腐败的原因然后我突然想到他们可能会提交腐败文件。

我采用了以前的记录,并确定了一些用户的文件类型最喜欢的格式,这些用户来自我们收到的文件损坏。

我将扩展更改回最喜欢的扩展和繁荣..文件已打开。

我所知道的是,但是大胆地告诉用户如何将文件传送给pdf一些(很多)只是改变了扩展和提交。           由于网站奖励用户没有。文件提交管理人员对我嗤之以鼻。有没有办法可以在不依赖扩展的情况下检查文件是否为pdf?

我在c#3.5 asp.net中使用fileupload

2 个答案:

答案 0 :(得分:10)

由于所有PDF文件都以ASCII字符串“%PDF-”开头,因此只需测试文件的前几个字节,以确保它们以此字符串开头。

bool IsPdf(string path)
{
    var pdfString = "%PDF-";
    var pdfBytes = Encoding.ASCII.GetBytes(pdfString);
    var len = pdfBytes.Length;
    var buf = new byte[len];
    var remaining = len;
    var pos = 0;
    using(var f = File.OpenRead(path))
    {
        while(remaining > 0)
        {
            var amtRead = f.Read(buf, pos, remaining);
            if(amtRead == 0) return false;
            remaining -= amtRead;
            pos += amtRead;
        }
    }
    return pdfBytes.SequenceEqual(buf);
}

答案 1 :(得分:4)

我发现this site非常有用,可以帮助确定文件是否与其扩展名匹配。这是一个巨大的文件签名列表,您可以使用它与代码的代码一起使用。