2017-02-23 93 views
0

我有下面的代碼來提示用戶的瀏覽器下載一個excel文件。這是ASP.NET web表單中的C#代碼C#:Chrome - 用戶下載excel文件

byte[] fileData = GetExcelFile(..); 
Response.Clear(); 
Response.ContentType = "application/vnd.ms-excel"; 
Response.AppendHeader("Content-Disposition", "attachment; filename=report.xlsx"); 
Response.OutputStream.Write(fileData, 0, fileData.Length); 
Response.OutputStream.Flush(); 
Response.OutputStream.Close(); 
Response.Flush(); 
Response.Close(); 
Response.End(); 

當用戶單擊網站上的按鈕時,會觸發此代碼。

它在IE11中完美工作;用戶會得到一個對話框,詢問他們是要保存還是打開文件。該文件打開正常。

但是,在Chrome 56.0.2924.87(最新版本)上,用戶得到'失敗 - 網絡'和'加載響應數據失敗'錯誤,並且沒有任何內容被下載到他們的計算機上。這部分代碼在一年內沒有改變,並且已經工作了一年。但是,我昨天測試了它,並停止工作。

這是發送Excel文件到用戶的響應

+0

Web窗體,MVC,API,核心? – krillgar

+1

您對'xlsx'文檔使用了錯誤的內容類型。 –

+0

打開瀏覽器控制檯,查看控制檯和網絡選項卡,它會告訴你爲什麼失敗。 – Gusman

回答

1

代替沖洗和關閉輸出數據的推薦方式,只是Response.BinaryWrite寫入數據。

此外請確保您使用正確的內容類型。 xlsx文件是壓縮的XML文件。 xlsx文件的正確內容類型是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

例如,假設EPPlus用於創建Excel文件:

private void DumpExcel(DataTable tbl) 
    { 
     using (ExcelPackage pck = new ExcelPackage()) 
     { 
      //Create the worksheet 
      ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo"); 

      //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1 
      ws.Cells["A1"].LoadFromDataTable(tbl, true); 

      byte[] fileData =pck.GetAsByteArray(); 

      //Write it back to the client 
      Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
      Response.AddHeader("content-disposition", "attachment; filename=ExcelDemo.xlsx"); 
      Response.BinaryWrite(pck.GetAsByteArray()); 
     } 
    } 

您可能需要調用Response.End();,以防止服務器發送你的頁面的其餘部分在相同的反應。

另一種選擇是使用ExcelPackage.SaveAs(Stream)將文件直接寫入輸出流。這消除了臨時緩衝區:

pck.SaveAs(Response.OutputStream); 
+0

感謝您的回覆。你是如何驗證application/vnd.openxmlformats-officedocument.spreadsheetml.sheet是否是正確的內容類型的? – user2769810

+0

此外,我試過你的解決方案,它的工作原理。但是,當文件在Excel中打開時,我會收到一個「Excel在'... xlsx'中發現無法讀取的內容'」您是否想要恢復此工作簿的內容?「是否可能與解決方案有關 – user2769810

+0

這是一個很好的已知的內容類型,您使用的是舊的'xls'文件 –