在asp.net中向客户端导出大量数据
Posted
技术标签:
【中文标题】在asp.net中向客户端导出大量数据【英文标题】:Export large amounts of data to client in asp.net 【发布时间】:2010-10-24 15:35:00 【问题描述】:我需要通过网络将大量数据 (~100mb) 从 sql 表导出给用户。这样做的最佳解决方案是什么?一种想法是将数据导出到数据库服务器上的文件夹,压缩它(通过某种方式),然后为用户提供下载链接。还有其他方法吗?另外,我们可以从 sql server 中压缩数据吗?
欢迎任何方法。
【问题讨论】:
您的目标格式是什么?最终用户最终会下载什么? Xml? CSV?一个实际的 Sql Server 数据库文件? 一个 Excel 文件/csv 文件。两种格式都可以。 【参考方案1】:我不会占用数据库等待用户下载 100Mb,即使对于高速用户也是如此。当用户请求文件时,让他们指定一个电子邮件地址。然后调用异步进程来提取数据,将其写入临时文件(毕竟内存中不希望 > 100mb),然后将临时文件压缩到存储位置,然后向用户发送一封包含下载链接的电子邮件文件。
【讨论】:
我唯一要补充的是需要清理旧文件(即定期删除那些 >100MB 的文件);使用简单的脚本和计划任务很容易做到。并且不要忘记让用户知道该文件仅在有限的时间内可用。【参考方案2】:您可以使用文件响应页面请求:
Response.AddHeader("Content-Disposition",
"attachment; filename=yourfile.csv");
Response.ContentType = "text/plain";
请务必关闭缓冲,以便 IIS 可以在您构建第二部分时开始发送文件的第一部分:
Response.BufferOutput = false;
之后,您可以开始编写文件,如下所示:
Response.Write("field1,field2,field3\r\n");
文件完全写入后,结束响应,因此 ASP.NET 不会将网页附加到您的文件中:
Response.End();
这样,您不必在网络服务器上写入文件,只需在内存中创建文件并将它们发送给您的用户。
如果需要压缩,你可以用同样的方法写一个 ZIP 文件。这是一个很好的free library 来创建 ZIP 文件。
【讨论】:
注意:如果数据库和最终用户之间没有缓冲,进程将持有锁,直到整个行集被发送。如果您只是执行 READ COMMITTED,它不会有很多锁,但仍然会有一些锁。例如,如果表的任何写入者试图升级,这将禁止他们获取表锁。对于高速最终用户来说可能还不错,但对于慢速链接可能会很糟糕。 +1 Response.BufferOutput 是一个很好的“快速修复”。我仍然觉得@Goblyn27 的解决方案是更“正确”的方法,但是当您时间紧迫并且用户现在需要他们的报告时,禁用输出缓冲区效果很好。【参考方案3】:您的方法效果很好。如果您需要多次执行此过程,SSIS + 7zip 可能对自动化流程很有用。
【讨论】:
【参考方案4】:如果 XML 没问题,一种方法是选择数据“FOR XML”,如下所示: http://www.sqljunkies.ddj.com/Article/296D1B56-8BDD-4236-808F-E62CC1908C4E.scuk
然后将原始 XML 作为内容类型直接吐出到浏览器:text/xml。还要确保在您的 Web 服务器上为具有 XML 扩展名的文件设置 Gzip 压缩。 http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true
这会将 XML 文件缩小到传输大小的 1/3 或 1/4。由于 XML 文件中固有的浪费空间,这不是性能最高的选项,但很大程度上取决于您最终要寻找的格式。
另一种选择是使用免费的 CSharpZipLib 将 XML(或您想要的任何格式)压缩成用户可以下载的 zip 文件。沿着这些思路,如果这是经常使用的东西,您可能需要考虑将 zip 文件缓存并存储在具有某种到期时间的 Web 服务器上,这样它就不会为每个请求重新生成。
【讨论】:
【参考方案5】:下载链接是一个完全有效且合理的解决方案。另一种方法是自动将用户重定向到该文件,这样他们就不需要单击链接。这实际上取决于您的工作流程和 UI 体验。
我建议不要在 SQL Server 引擎中实现压缩。而是查看 DotNetZip 库(或 System.IO.Conpression,如果您认为您的用户具有解压缩 gzip 存档的能力)并在 Web 应用程序中实现压缩。
【讨论】:
以上是关于在asp.net中向客户端导出大量数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core 2.1 中向 Visual Studio 添加新的 Razor 页面模板?
如何在 ASP.NET MVC 中向客户端发送 XML 文件
asp.net 按钮单击未通过 jquery 在隐藏字段中触发大量数据