【问题标题】:ASP.NET MVC FileResult is corrupting filesASP.NET MVC FileResult 正在损坏文件
【发布时间】:2016-03-14 01:24:59
【问题描述】:

我一直在尝试让我的 ASP.NET MVC 网站将一些数据导出为 Excel 文件。几个小时以来,我一直认为 NPOI 只是在制造垃圾,所以我切换到了 EPPlus。我在 LINQPad 中对其进行了测试,它创建了一个正常工作的 XLSX 文件,因此我将代码移至 MVC 应用程序。再次,我得到损坏的文件。我碰巧查看了 temp 目录,发现 EPPlus 创建的文件为 3.87KB 并且运行良好,但 FileResult 返回的文件为 6.42KB,该文件已损坏。为什么会这样?我在某处读到它是服务器 GZip 压缩导致它,所以我将其关闭,它没有任何效果。有人,请帮帮我,我快疯了……这是我的代码。

[HttpGet]
public FileResult Excel(
    CenturyLinkOrderExcelQueryModel query) {
    var file = Manager.GetExcelFile(query); // FileInfo

    return File(file.FullName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", query.FileName);
}

【问题讨论】:

  • file.FullName的类型和值是什么?它是一个字节数组吗?您是否尝试在文件名中添加正确的文件扩展名,例如“.xls”?
  • fileFileInfo 类型,所以不,它不是字节数组。返回的路径是正确的,并且具有适当的扩展名。

标签: c# asp.net-mvc excel asp.net-mvc-5


【解决方案1】:

就我而言,FileResult 及其附带的方法存在问题。我最终通过覆盖 Response 对象“解决”了这个问题:

[HttpGet]
public void Excel(
    CenturyLinkOrderExcelQueryModel query) {
    var file = Manager.GetExcelFile(query);

    Response.Clear();
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AddHeader("Content-Disposition", "attachment; filename=" + query.FileName);
    Response.BinaryWrite(System.IO.File.ReadAllBytes(file.FullName));
    Response.Flush();
    Response.Close();
    Response.End();
}

【讨论】:

    【解决方案2】:

    尝试使用FileInfo 中的OpenRead 获取文件流,看看是否可行。

    [HttpGet]
    public FileResult Excel(CenturyLinkOrderExcelQueryModel query) {
        var file = Manager.GetExcelFile(query); // FileInfo
        var fileStream = file.OpenRead();
        return File(fileStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", query.FileName);
    }
    

    【讨论】:

    • 它没有用。它吐出的文件是 6.44KB,比我之前的代码大 0.02KB。是否有可能将响应标头添加为二进制文件的一部分?这是我能想到的唯一会与请求一起提供的信息。
    • 只是为了调试,检查fileStream的长度,看看它是文件的预期大小。
    • 我之前做过,它是预期的大小,3972(或者那里的某个地方,但它是我期望的 ~4KB 文件)。
    • 这是到达return File(...) 行时的预期大小。此后,我相信该框架以某种方式填充它并发送回一个无法打开的膨胀大小的文件。我在下面发布了我如何“解决”它的答案。就我而言,这是一个框架问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2017-12-03
    相关资源
    最近更新 更多