6

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

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

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

我花了很多不眠之夜来确定损坏的原因,然后突然我想可能是他们提交了损坏的文件。

我获取了以前的记录,并确定了一些我们从中获取损坏文件的用户最喜欢的文件类型格式。

我把扩展改回了最喜欢的扩展和繁荣..文件打开了。

然而,尽管我用粗体字告诉用户如何将文件转换为 pdf 一些(很多)只是改变了扩展和提交,但我才知道。由于该网站不奖励用户。提交的文件管理人员对我抱怨。有什么方法可以在不依赖扩展名的情况下检查文件是否为pdf?

我在 c# 3.5 asp.net 中使用文件上传

4

2 回答 2

20

由于所有 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);
}
于 2013-04-15T11:54:59.720 回答
6

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

于 2013-04-15T16:09:08.490 回答