我必须生成大型csv文件,这些文件通过对原始数据的一些最小处理来从数据库导出数据。
将文件下载到用户,使用putcsv编写块。我的问题是下载可以在完成之前停止,并且用户不会注意到csv是否被截断。
问题:有没有办法为cvsfile添加完整性提示,以便用户可以检查文件是否包含应该包含的所有数据?
一种解决方案是在所有记录的最后一行添加,客户端应该检查,但看起来更像是黑客
答案 0 :(得分:2)
CSV规范不会为任何类型的文件完整性检查留出空间。因此,如果您希望自动接收CSV解析器,那么您就无法做到。问题的一部分是没有真正的CSV规范,根据我的经验,不同的解析器对CSV的含义略有不同。无论哪种方式,CSV"规范"都没有内置完整性检查。您可以期望任何CSV解析器自动注意到。添加一些东西会让最终用户有机会自己验证文件,但是我再次怀疑是否有人会费心去检查。
一种可能的选择是将内容长度与文件一起发送。然后,当总内容与所告知的内容不匹配时,浏览器可以检测到中断的下载。那里的确切行为可能因浏览器而异,但您必须运行一些测试以确定这是否真的有用。
但是,这也要求您事先知道文件的长度,这意味着在内存中构建它,测量大小,然后转储到浏览器。这本身就有一些缺点,包括你受内存大小限制的事实(虽然你可以通过php:// temp缓解它)。此外,下载不会开始直到文件完全构建,并且如果用户认为下载被冻结,则根据所花费的时间长度可能会导致更多的取消。
完全不同的解决方案是将文件内容写入磁盘(在后台),然后在构建文件时通过下载链接向用户发送电子邮件。这样他们就不会在你的下载脚本上等待,而实际的下载只是由你的网络服务器直接管理的简单文件下载,这将更快,更不容易出错。