为什么文件名中的空格会导致IE在文件下载时删除文件扩展名?

时间:2014-02-20 18:29:43

标签: asp.net-mvc internet-explorer download asp.net-mvc-5 file-extension

我正在使用EPPlus从CSV创建Excel文件,该文件无问题。遗憾的是,以下代码会导致Internet Explorer 9,10和11删除.xlsx文件扩展名,而Chrome和Firefox则不会。如果我从文件名中删除空格,则文件扩展名在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浏览器时,如何在文件名中包含空格而不会丢失文件扩展名?

1 个答案:

答案 0 :(得分: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");
}