2013-04-15 56 views
0

conserned网站的主要工作是接受来自用户的文件并保存它。直到2个月前,当我被告知强制约束接受PDF文件时,每件事都很好。是否可以验证张贴的文件是否为pdf?

用户之前,从文本,RTF,以良好的PDF提交各种格式的习惯。

我通过检查文件扩展来应用约束 - 简单吗?然而,当管理员检查这些文件时,一些好的60%的文件被损坏了。

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

我把以前的记录,并确定了一些用户的文件类型从whome我们得到损坏文件的喜爱格式。

我改变进一步扩展回到那里最喜欢的推广与繁荣..打开的文件。

我才知道不过dispite在大胆的告诉用户如何convet有文件为PDF一些(许多)只是改变的推广与提交。 由于网站奖励用户没有。文件提交的行政人员对我咕g。有什么办法我可以检查文件是PDF还是不依赖于扩展?

我在C#3.5 asp.net

+0

看看POST mimetype。 –

+0

怎么样?我已将其设置为应用程序/二进制 – Ratna

+0

每个PDF的开头都有一个特殊的字符序列,只需检查它即可。 – Ambar

回答

6

由于所有的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); 
} 
+0

Thankx人很容易,几乎没有修改你的代码的工作。再次感谢。 – Ratna

+0

对此有两点评论。首先,尽管目前的PDF规范对此非常严格,但较老的不太严格。 Adobe Acrobat用于(不确定当前版本)接受文件的前1024个字节中具有%PDF字符串的任何文件(并接受其前面为垃圾的内容)。其次,在此假设下,以文本“%PDF-”开头的简单文本文件将被接受为有效的PDF文件。我希望你的文件提交者不是很聪明:) –

1

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

相关问题