C# 是否可以验证发布的文件是否为pdf格式?

C# 是否可以验证发布的文件是否为pdf格式?,c#,asp.net,pdf,C#,Asp.net,Pdf,conserned网站的主要工作是接受用户的文件并保存。直到2个月前,我被告知强制只接受pdf文件,一切都很好 在此之前,用户习惯于提交各种格式的文本、rtf和良好的pdf 我通过检查文件扩展名应用了约束——简单,对吗??但是,当管理员检查这些文件时,有60%的文件已损坏 我花了很多个不眠之夜来确定发生腐败的原因,然后突然我想可能是他们提交了腐败的文件 我收集了以前的记录,并确定了一些用户最喜欢的文件类型格式,我们从这些用户那里得到了损坏的文件 我把分机改回了最喜欢的分机。。文件打开了 然而,我

conserned网站的主要工作是接受用户的文件并保存。直到2个月前,我被告知强制只接受pdf文件,一切都很好

在此之前,用户习惯于提交各种格式的文本、rtf和良好的pdf

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

我花了很多个不眠之夜来确定发生腐败的原因,然后突然我想可能是他们提交了腐败的文件

我收集了以前的记录,并确定了一些用户最喜欢的文件类型格式,我们从这些用户那里得到了损坏的文件

我把分机改回了最喜欢的分机。。文件打开了

然而,我所知道的是,我用粗体告诉用户如何将这些文件转换成pdf,有些(很多)只是在更改扩展名并提交。 由于网站以提交的文件数量奖励用户,管理人员对我抱怨不已。是否有任何方法可以检查文件是否为pdf,而不依赖扩展名


我在c#3.5 asp.net中使用fileupload,因为所有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);
}

我发现在帮助确定文件是否与其扩展名匹配方面非常有用。这是一个庞大的文件签名列表,您可以使用spender的代码。

查看POST mimetype。如何??我已将其设置为application/binary每个PDF的开头都有一个特殊的字符序列,只需检查一下。检查文件是否以%PDF开头-正如PDF规范所要求的那样:PDF文件的第一行应该是一个由5个字符%PDF组成的头文件,后跟一个1.N表格的版本号,其中N是介于0和7之间的数字。(参见第7.5.2节。)@mkl你能给我提供一些代码吗..要做到这一点,谢谢你,很简单,只需对你的代码做一点修改就行了。再次感谢你。对此有两条评论。首先,虽然当前的PDF规范对此相当严格,但较旧的规范没有那么严格。Adobe Acrobat过去(不确定当前版本)接受任何在文件的前1024个字节中包含%PDF-字符串的文件(并接受之前的垃圾文件)。其次,在此假设下,以文本“%PDF-”开头的简单文本文件将被接受为有效的PDF文件。我希望你的文件提交者不是很聪明:)对于读取和比较5个字节这样简单的事情,这是一个复杂的解决方案。我刚刚拒绝了对这个问题的编辑,该问题忽略了read的返回值,试图“简化”这段代码。Stream.Read的返回值不应为空ignored@MustafaOzturk如果您觉得有更有效的方法来实现这一点,请随时提供答案。我很乐意投赞成票。用Chilkat