2012-05-11 104 views
0

我有一個通用的處理程序,下載提供文件服務:流的PDF文件生成的Adobe閱讀器損壞錯誤

Dim request As HttpRequest = context.Request 
    Dim response As HttpResponse = context.Response 
    response.ContentType = "application/octet-stream" 
    response.AddHeader("content-disposition", "inline; filename=" & filename) 
    response.Buffer = True 
    response.OutputStream.Write(fileBytes, 0, fileBytes.Length) 
    response.Flush() 
    response.Close() 

(「fileBites」是我咬陣列,文件名「」是我的文件名)。

當fileBites是.txt文件時 - 觸發下載並完美讀取文件。

但是,我發現.pdf和.docx文件被損壞 - 對於.docx,Word說這個文件需要恢復,並要求我允許這樣做。當我授予此許可時,立即修復並完美顯示。

很明顯,我不希望用戶看到這個腐敗對話,經過一段時間的研究,我發現了這個:http://forums.asp.net/t/1301978.aspx/1/10 - 這表明腐敗的原因是在字節的末尾寫入了一個額外的空位數組:我檢查由一個比特丟棄長度:

response.OutputStream.Write(fileBytes,0,fileBytes.Length - 1)

和像變魔術一樣,.DOCX下載現在的工作! (這不是我目前的問題,我包括它的上下文和以防其他人有相同的問題)

我目前的問題是,雖然.docx文件現在正確流式傳輸,.pdf文件不是。他們似乎在一塊轉移(在正確的KB大小),但是當我嘗試打開下載的文件的Adobe Reader X告訴我:

Adobe Reader could not open xxxx because it is either not a supported file type 
or because the file has been damaged (for example, it was sent as an email 
attachment and wasn't correctly decoded). 

有關於二零零八年的土坯論壇一個相當長的未解決的討論( http://forums.adobe.com/thread/391712),解決這個確切的問題,但現在已經死了。我嘗試了用戶發佈的所有解決方法(內容類型:/ pdf not/octet,處置:應用程序不內聯,不同的內容編碼和字符集等),但都無濟於事。

我不知道是否有人遇到過這個問題,然後我可能會指向某個模糊的東西,甚至遠遠地類似於正確的方向!

+2

您是否有我可以查看的樣本損壞的PDF文件? – iPDFdev

+0

「顯然Adobe Reader在保存時將文件的名稱嵌入到二進制對象中」這並非如此......首先,Adobe Reader通常不會生成PDF文件。我不知道什麼解決了你的問題,但我99.9999%肯定這不是原因。 – yms

+0

嗯,它只會在內容處理中發送原始文件名時纔會打開?它必須對某些事物進行驗證。 - 我會說,它是由創建PDF的應用程序嵌入的,但後來認識到,如果文件在文件系統內被重命名,則需要維護 - 我無法想象文件系統會重新嵌入它自己的路徑,但從一個去構造性的pov,如果它只在發送確切的文件名時才起作用,那麼這個文件名必須嵌入二進制對象的某個地方以識別匹配? –

回答

0

(答案評價和編輯見Question with no answers, but issue solved in the comments (or extended in chat)

的OP寫道:

它已經盯着幾個小時,答案張貼這個問題後不久出現了 - 這是經常的辦法!無論如何,這裏是任何其他人堅持我的具體問題的決議:

當我添加一個文件到數據庫中時,我也允許它被重命名。我會選擇一個文件,給它一個名字並將其存儲在數據庫中作爲[Fileblob],[Filename] - 我可以選擇任意任意名稱,因爲它不再綁定到文件系統中的特定位置。 - 錯! - 使用.txt和.docx文件,這很好,原始名稱從未被調用過。

很顯然,在保存文件時,文件的名稱會嵌入到二進制對象中,並在打開文件時檢查內容處置中提供的名稱與嵌入到文檔中的名稱。如果它們不匹配,它會拋出一個腐敗錯誤。現在

,我在數據庫中存儲爲[Fileblob],[Filename],[originalFilename]文件並打開它時,我使用:

response.AddHeader("content-disposition", "inline;filename=" & originalFilename) 

..to給它理解的名稱。我想更優雅的方式是將原始名稱從PDF中刪除,因爲它不再需要,但作爲解決方法,這工作得很好。