【问题标题】:Let the user download a generated file in ASP.Net让用户在 ASP.Net 中下载生成的文件
【发布时间】:2014-07-17 13:45:44
【问题描述】:

我正在创建一个 ASP.Net Web 应用程序,我想添加一个导出功能。当单击按钮时,该功能将生成一个字符串(具体来说是 xml)。

我想让用户把这个字符串下载为一个文件。

我是否需要在服务器的硬盘上创建一个文件并打开一个指向该文件的链接,还是有办法直接下载该字符串(以便 ASP.net 负责创建和删除该文件)?

我目前正在尝试执行以下操作:

Response.Clear();
Response.Buffer = true;
Response.ContentEncoding = Encoding.GetEncoding(1252);
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment; filename=filename.txls");
//Multiple Response.Write(string) calls to add content to the file
Response.End();

使用萤火虫,我发现用户收到标题,但文件没有打开。

Internet Explorer 甚至可以向我显示响应文本并有一个保存文件的按钮(这两个选项仅在开发人员工具中可用)并且文件是正确的,但仍然无法打开文件一个窗口(也不是浏览器内预览)。

当我使用 Internet Explorer(似乎有更好的 Visual Studio 调试集成)时,出现 JavaScript 错误:

The EnableScriptGlobalization property cannot be changed during async postbacks or after the Init event.

调用 Response.Write() 似乎是此问题的常见原因。当然,我多次调用该方法。

我发现网页上的 JavaScript(脚本似乎是自动生成的)试图解析响应,但它当然不是以 asp.NET 内部通信格式格式化,而是以我自己的 XML格式。

如何告诉页面将我的页面视为可下载文件?

【问题讨论】:

  • 那太棒了。你试过什么?他们从什么上下文下载它? Web 表单页面? MVC 网站?网络API?您需要具体说明您的要求,提供一个显示下载位置的代码示例可能会有所帮助。
  • 感谢您指出这一点,梅森。我在帖子中添加了必要的细节。当然,如果有什么遗漏,我很乐意提供。

标签: asp.net download


【解决方案1】:
string someXML=GetXMLContent();//I assume you have an implementation of this
Response.Clear();
Response.ContentType = "text/xml";
Response.AddHeader("Content-Disposition", "attachment; filename=filename.xml");
Response.Write(someXML);
Response.End();

有几点需要注意。最好尽早构建您的 XML 字符串,然后一次性将其写入响应。它使代码更简洁,因为您可以通过这种方式分离您的关注点。

另外,我将内容类型切换为“text/xml”,因为这不是 Excel 文件。另外,您的文件扩展名不正确。 XML 按照约定以.xml 结尾。我删除了内容编码,因为大多数时候都没有必要。如果您正在处理奇怪的角色,请随时将其添加回来。还以删除不必要的东西的名义删除了缓冲区。

试试这个,然后尝试在文本编辑器中打开生成的文件并验证内容。

【讨论】:

  • 为了简单起见,我使用 <I><Like>Testing</Like></I> 而不是 GetXMLContent() 准确地添加了您那里的代码。最后一行中的断点被命中,但没有任何反应。
  • 您从哪里调用此代码?按钮单击处理程序?请更新您的问题以包含该信息。
  • 是的,我从按钮点击处理程序内部调用此代码
  • @jalgames 您需要更新您的问题以显示相关代码。
  • 哪个代码?它是按钮处理程序中的唯一代码,其他代码正是您答案中的代码。
【解决方案2】:

问题是负责触发 Excel 导出的按钮不是 PostBackTrigger。一旦我改变它,一切都像魅力一样。

不过,我不知道为什么这会解决所有问题。当我将按钮设置为 PostBackTrigger 时会发生什么变化

【讨论】:

  • 每当您遇到问题并且涉及到 UpdatePanel 时,您都需要在问题中提及这一点。 UpdatePanel 因破坏事物而臭名昭著。事实上,我建议您永远不要使用 UpdatePanel。由于您没有将其定义为 PostBackTrigger,因此它作为 AsyncPostBackTrigger 运行,该 AsyncPostBackTrigger 通过 AJAX 将数据返回到客户端,而不是将其作为要下载的文件呈现给浏览器。这就是为什么在您的问题中提供所有相关代码如此重要的原因,我们可以更快地找到这一点。
  • 好的...我只是不知道这是相关的,我不想发布所有代码(超过 700 行),但将来,我会记得我在问题中提及这些事情......
  • 不,您不会发布所有代码。您发布所有相关代码。你如何确定什么是相关的?见How to create a Minimal, Complete, and Verifiable example。通过遵循那里的指南,您可能会自己找出问题所在,如果不是,那么至少您可以让其他人轻松找出您的问题。
猜你喜欢
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 2021-09-08
相关资源
最近更新 更多