4

我正在使用EPPlus從CSV中創建Excel文件,該文件沒有問題。不幸的是,下面的代碼會導致Internet Explorer 9,10和11刪除.xlsx文件擴展名,而Chrome和Firefox則不會。如果我從文件名中刪除空格,則文件擴展名在IE中按預期工作。爲什麼文件名中的空格會導致IE在文件下載時刪除文件擴展名?

public FileStreamResult DetailsExcel(string id) 
{ 
    string custName; 
    var csv = this.GetCsvForCustomer(id, out custName); 
    var fileName = String.Format("Report for {0} ({1:d-M-yyyy HH mm})", 
     custName, DateTime.Now); 

    MemoryStream stream; 

    using (var excelPackage = new ExcelPackage()) 
    { 
     var ws = excelPackage.Workbook.Worksheets.Add(fileName); 
     ws.Cells["A1"].LoadFromText(csv, this._excelTextFormat); 
     stream = new MemoryStream(excelPackage.GetAsByteArray()); 
    } 

    return File(stream, 
     "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 
     fileName + ".xlsx"); 
} 

,我發現有些工作在引號包文件名或來urlencode串兩個綱領性機制。每個都有問題:

String.Format("\"{0}\".xlsx", fileName) 
// above renders: __Report for Customer (20-2-2014 11 04)__.xlsx 

HttpUtility.UrlEncode(fileName + ".xlsx") 
// above renders: Report+for+Customer+(20-2-2014+11+04).xlsx 

以上都不是最佳。當用戶使用IE瀏覽器時,如何在文件名中包含空格而不丟失文件擴展名?

+0

看起來像'__'而不是引號:)。包括文件名和擴展名的全名需要引用。 – Teemu

+0

@Teemu權利比UrlEncode選項更好,但仍然不是很棒。 :) – ahsteele

回答

0

我一直無法重現您在類似應用程序中描述的行爲。唯一的區別是我沒有首先將字節數組加載到MemoryStream中,只是將字節數組傳遞給File

因此,請嘗試從等式中刪除MemoryStream。所以代碼將最終類似於:

public ActionResult DetailsExcel(string id) 
{ 
    byte[] stream; // changed to byte array 

    using (var excelPackage = new ExcelPackage()) 
    { 
     var ws = excelPackage.Workbook.Worksheets.Add(fileName); 
     ws.Cells["A1"].LoadFromText(csv, this._excelTextFormat); 
     stream = excelPackage.GetAsByteArray(); // removed MemoryStream 
    } 

    return File(stream, 
     "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 
     fileName + ".xlsx"); 
} 
+0

現在在手機上,所以還沒有測試你的修復。同時想問你的類似應用程序是否是ASP.NET MVC 5? – ahsteele

+0

@ahsteele我的項目是MVC4。但是看看ASP.NET MVC的源代碼,['FileContentResult'](https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/FileContentResult.cs)和['FileStreamResult'] (https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/FileStreamResult.cs)自2012年4月6日起並未更改。因此它們在MVC4和MVC5中是相同的。當然,堆棧中的其他東西可能會影響它,但我認爲這是IE處理「FileStreamResult」使用的分塊的方式。 –

+0

我在回家的路上想着同樣的事情。一定會在早上讓它旋轉。謝謝你的跟進,我會讓你知道的。 – ahsteele