C#Excel文件下载破坏文件?

时间:2014-10-19 12:03:48

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

我已经编写了一些代码,可以将某个文件下载到用户的计算机上,这是一个MS Excel .xlsx文件。问题是,当用户从我的网络应用程序下载并打开文件时,我会在excel中收到一条消息说"我们发现file.xlsx中的某些内容存在问题。"然后我单击是以恢复内容,这是日志文件显示的内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><logFileName>error128120_01.xml</logFileName><summary>Errors were detected in file 'F:\Downloads\file.xlsx'</summary><additionalInfo><info>Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.</info></additionalInfo></recoveryLog>

这是我用来在C#中下载文件的代码。根据我的研究,我相信这是.xlsx的正确mimetype。此外,当我在文件夹资源管理器中打开文件时,问题不会出现,仅在下载后才会出现。我已经尝试过谷歌浏览器和Internet Explorer。

        var fileInfo = new FileInfo(Path.Combine(Server.MapPath("~/Content/"), "file.xlsx"));
        Response.Clear();
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + "file.xlsx");
        Response.TransmitFile(fileInfo.FullName);
        Response.Flush();

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您是否检查过该文件确实没有损坏?

如果您使用的是ASP .NET MVC,为什么不从您的操作中返回FileResult?我会考虑这样做的标准方式。

更新 您可以让控制器通过从中返回FileResult将文件发送到浏览器进行下载。使用File方法的方式与控制器内部的View方法非常相似。

示例:

public ActionResult(int id)
{
    var downloadStream = GetSomePdfStream(id);
    //note how I specified the MIME type, so that the browser knows what am I sending to it.
    return File(downloadStream, "application/pdf", "file.pdf"); 
}

从byte []或Stream或path:

返回文件有几种方便的重载
File(Stream stream, string mime, string downloadName) //returns System.Web.Mvc.FileStreamResult:FileResult
File(string fileName, string mime, string downloadName);//returns FilePathResult:FileResult
File(byte[] contents, string mime, string downloadName);//returns FileContentResult:FileResult

答案 1 :(得分:1)

有时它是编码问题

 var result = new StreamWriter(output); 

写入输出缓冲区流时不要使用任何特定的编码