将ASP.Net文件下载到客户端浏览器

23

我正在编写一个简单的测试页面,以便在按钮点击时从浏览器下载文本文件。我遇到了一个非常奇怪的错误,这是我从未见过的。有什么想法吗?

错误发生在 Response.End();上,并且该文件从未传输到客户端浏览器

代码:

  string filePath = "C:\\test.txt";
  FileInfo file = new FileInfo(filePath);
  if (file.Exists)
  {
    Response.ClearContent();
    Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
    Response.AddHeader("Content-Length", file.Length.ToString());
    Response.ContentType = "text/plain";
    Response.TransmitFile(file.FullName);
    Response.End();
  }

错误:

由于代码已经被优化或者本地框架在调用堆栈的顶部,无法评估表达式。


1
移除结尾,并尝试使用Responce.Flush()和Responce.ApplicationInstance.CompleteRequest(); - Aristos
好的,这样做可以防止异常被抛出。但是代码仍然完成而在浏览器上没有发生任何事情。 ?? - tier1
2个回答

40

试着把它改成这样。

 Response.Clear();
 Response.ClearHeaders();
 Response.ClearContent();
 Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
 Response.AddHeader("Content-Length", file.Length.ToString());
 Response.ContentType = "text/plain";
 Response.Flush();
 Response.TransmitFile(file.FullName);
 Response.End();

1
@Ashwin:我正在尝试在我的代码后台文件中使用此解决方案(我的问题在https://dev59.com/V3bZa4cB1Zd3GeqPFm6q),但无论我在哪里尝试调用`TransmitFile()`或`WriteFile()`,我都会收到一个异常:“服务器无法在HTTP标头发送后设置内容类型。” 有什么建议吗? - Codes with Hammer
1
Response.End()本质上会引发异常。 - yazanpro
这对我们的应用程序起作用,该应用程序使用此方法允许用户下载 .svg 文件。 - ahwm
1
Response.Clear();Response.ClearContent(); 的作用是相同的,具体可以参考 这里。为什么会有两个呢? - Trisped
可以使用文件流来完成吗?用户选择保存位置,然后我们将文件流传输到该位置? - bgmCoder
显示剩余2条评论

8
如果您在下载文件时遇到名称问题,可以对上述解决方案进行轻微调整...
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.Name + "\"");

这将返回准确的文件名,即使它包含空格或其他字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接