2009-05-01 57 views
1

我有一些將圖像和文件上傳到數據庫的C#代碼。目前我認爲它適用於所有適合mimetypes列表的文檔。但它在某些pdf上失敗。將PDF v1.3上傳到數據庫

我已經縮小了問題的範圍,因爲有些pdf格式是1.3格式,有些格式是1.4格式。 1.4可以正常上傳,但1.3不會上傳,並且不會產生任何運行時錯誤,只是無法添加。

一些上傳的PDF當前代碼是

Checks for valid MIME Type 
... 

byte[] fileData = new byte[uploadFile.ContentLength]; 
uploadFile.InputStream.Read(fileData, 0, uploadFile.ContentLength); 

... 
Continues on to Uploads to db. 

對於PDF的是尋找「應用程序/ PDF格式」作爲MIME類型。我不認爲在1.3格式中有另一種類型的pdf,但也許我錯了。

以前任何人都有過這個問題,並有關於如何糾正它的任何建議?

+0

你的PDF文件的大小是多少? – 2009-05-01 20:57:24

回答

0

看來這只是一個愚蠢的錯誤。該文件具有.PDF擴展名,與.pdf不同。愚蠢的帽子給了我。一些額外的調試語句做了這個訣竅。

1

問題可能是您從輸入流中讀取的方式。

無論何時處理流,都應該反覆讀取,並注意每次迭代的返回值。所以你的原始代碼應該是:

byte[] fileData = new byte[uploadFile.ContentLength]; 
int totalRead = 0; 
while (totalRead < fileData.Length) 
{ 
    int read = uploadFile.InputStream.Read(fileData, totalRead, 
              fileData.Length - totalRead); 
    if (read == 0) 
    { 
     throw new IOException("Input data was truncated"); 
    } 
    totalRead += read; 
} 

但是,這可能不是問題。我希望這會導致截斷的數據,而不是完全沒有數據。當你說它「只是不能被添加」你能更具體嗎?你有多少日誌記錄?哪裏的代碼實際上將數據插入數據庫?你的日誌顯示什麼MIME類型的情況下,它的失敗?

在我聽起來像額外的日誌記錄可能會使巨大的差異在這裏...目前要麼你不知道它會出錯哪裏,或者你只是沒有告訴我們。記錄應該很清楚。

0

我同意Jon Skeet對這個問題的回答。其差別可能是因爲Adobe在PDF 1.4中添加了一些新的壓縮技術,因此您的1.4 PDF可能比1.3 PDF要小得多。因此,讀取循環的需要可能僅作爲v1.3 PDF文件的結果。 (但這只是猜測)

0

也許它不是pdf的版本。 Adobe沒有在1.4中引入線性PDF文件嗎?

數據立即可用「快速查看網頁」pdf獲得,並且數據在上傳完成後纔可用標準pdf格式。如果您在傳輸完成之前嘗試寫入數據庫,可能會使用線性化的pdf而不是標準的。

不管怎樣,Jon Skeet是對的。記錄或正確放置的斷點會告訴你。