我今天早上花了一些時間試圖幫助一個有着三個人的奇怪bug的同事難住。該方案是我們有一個正在開發的系統,它允許用戶將pdf文件附加到數據記錄中。系統使用服務來存儲和檢索服務器中的文件,並將標識符存儲在附件表中以指示哪些文件屬於哪些記錄。流媒體pdf失敗 - 找不到文件
然後,在應用程序中的兩個不同頁面上,我們有一個網格顯示記錄的附件列表。網格內有鏈接按鈕,允許用戶打開指定的附件。鏈接按鈕引發一個傳遞附件標識符作爲參數的命令事件。在命令事件處理程序中,我們從參數中獲取標識符,使用它從字節數組形式的服務中檢索附件,然後覆蓋響應對象以返回附件。這裏是代碼:
byte[] byteFile = DataHandler.GetAttachmentDocument(selectedAttachmentID);
if (DataHandler.sErrorMsg != "")
{//Error trying to retrieve file...
this.DisplayMessageBox(DataHandler.sErrorMsg);
}
else
{//File retrieved...
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=" + lblAttachmentName.Text);
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite(byteFile);
Response.Flush();
Response.Close();
Response.End();
}
現在這個完全相同的代碼在一個頁面上完美工作,並在另一個頁面上失敗。在這兩種情況下,當單擊按鈕並顯示下載對話框時,單擊打開按鈕並打開Adobe Reader閱讀器窗口。在工作頁面上,閱讀器窗口顯示所請求的文檔,但在另一頁面上,我們從閱讀器窗口中得到一個錯誤消息,說明:There was an error opening this document. This file cannot be found.
在調試器中運行,我們可以逐步看到byteFile中的字節數相同,並且我們正在逐步完整無誤地完成方法。
我們已經在Google上搜索了很多,並且沒有任何運氣嘗試了幾次這段代碼的變體。我知道我們嘗試過的一些事情是將內容類型更改爲八位字節流,將內容長度添加到標題,將緩衝區更改爲false,刪除內容處置屬性。唯一明顯不同的是刪除內容處置屬性,在這種情況下顯示文檔,但顯示在原始窗口中,而不是單獨的Adobe閱讀器窗口。另一個提出但尚未嘗試的想法是將網格和關聯的邏輯提取出來,然後在兩個頁面上重複使用網絡控件。還有其他建議嗎?
我們嘗試了您的建議和其他一些我發現探索您的鏈接。仍然有相同的問題,其中一個頁面的代碼工作,另一個沒有。 – Rozwel
您是否嘗試明確清除響應標頭? 'Response.Headers.Clear()' 另外,請檢查'lblAttachmentName.Text'是否有 - 可能是用不尋常的字符(?)以某種方式混淆了這個文件名。 – Leon