如果您可以向我解释为什么TransmitFile不能正常工作,代码很简单,那么我创建excel文件(.xlsx
),将其保存在服务器上并返回文件路径(通过CreateProjectsReport),然后我只想获取文件并将其传输给用户....
string filePath = CreateProjectsReport(ProjectIds, items);
System.IO.FileInfo file = new System.IO.FileInfo(filePath);
if (file.Exists)
{
HttpContext context = HttpContext.Current;
try
{
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.ClearContent();
context.Response.AddHeader("Content-Disposition",
"attachment; filename=" + file.Name);
context.Response.AddHeader("Content-Length", file.Length.ToString());
// context.Response.ContentType = "application
// vnd.openxmlformats-officedocument.spreadsheetml.sheet";
context.Response.ContentType = "application/vnd.ms-excel";
context.Response.TransmitFile(file.FullName);
context.Response.Flush();
// context.Response.WriteFile(file.FullName, false);
}
catch (Exception ex)
{
LogException(ex);
}
finally
{
System.IO.File.Delete(filePath);
context.Response.End();
}
}
此代码的结果是文件被保存在服务器上的预期文件夹中(完整报告存在,我已验证方法生成的excel文件),在response.Flush()
上,我看到该文件正在浏览器上传输内容长度为30kb
,因为文件长度在服务器上,但是一旦我单击“保存”并将文件保存到我的下载文件夹中,文件的长度为10kb
,用excel打开它会出现错误:{{1} }。
已检查IIS MIME类型,它已设置(我尝试将两者用于内容类型,都得到相同的错误):
.xls-Excel foudn unreadable content in 'filename.xlsx'. Do you want to recover ....
.xlsx-application/vnd.ms-excel
context.Response.TransmitFile是否禁止我的文件并且不发送文件的全部内容?为什么会这样?
编辑
通过浏览器控制台,我可以看到在application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
属性Response.Header
中文件的确切长度,但是一旦我单击content-length
文件,该文件的大小将从顶部的1kb变为15kb。服务器上30kb的文件(例如Save
不会传输整个文件