ASP.NET MVC FileResult 正在损坏文件

问题描述 投票:0回答:3

我一直在尝试让我的 ASP.NET MVC 网站将一些数据导出为 Excel 文件。几个小时以来,我一直以为 NPOI 只是在生产垃圾,所以我转向了 EPPlus。我在 LINQPad 中对其进行了测试,它创建了一个正常工作的 XLSX 文件,因此我将代码移至 MVC 应用程序。我再次收到损坏的文件。偶然间,我偶然查看了临时目录,发现 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);
}
c# asp.net-mvc excel asp.net-mvc-5
3个回答
2
投票

就我而言,

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();
}

0
投票

尝试使用

OpenRead
中的
FileInfo
获取文件流并查看是否有效。

[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);
}

0
投票

我正在使用

FileStreamResult(fileStream, MIMEType)
下载 Excel 文件。当我打开它时,它说:

Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded. 

Errors were detected in file ....

Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.

对我来说,我必须像这样下载文件才能解决问题并毫无问题地下载 Excel 文件:

    [HttpGet]
    public async Task<ActionResult> Download(Guid? Id)
    {
        Models.File fileInDb = .....;

        FileStream fileStream = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
        Response.BufferOutput = false;
        Response.ContentType = fileInDb.MIMEType;
        return new FileStreamResult(fileStream, fileInDb.MIMEType);
    }
© www.soinside.com 2019 - 2024. All rights reserved.