2013-04-15 93 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的代碼。

相關問題