我已经编写了一些代码,可以将某个文件下载到用户的计算机上,这是一个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();
有什么想法吗?
答案 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);
写入输出缓冲区流时不要使用任何特定的编码