【问题标题】:Add integrity checks to csv files with php使用 php 向 csv 文件添加完整性检查
【发布时间】:2017-06-06 21:39:45
【问题描述】:

我必须生成大型 csv 文件,从数据库中导出数据,并对原始数据进行一些最少的处理。

文件被下载给用户,用 putcsv 写入块。我的问题是下载可以在完成之前停止,用户不会注意到 csv 如果被截断。

问题:有没有办法向 cvsfile 添加完整性提示,以便用户检查文件是否包含所有应该包含的数据?

一种解决方案是在所有记录的最后一行添加,客户端应该检查它,但这似乎更像是一个 hack

【问题讨论】:

  • 发生错误时可能会打印错误:if(!fputcsv($fp, $row)) die('An error occured when downloading csv.');
  • 这将在 csv 文件中添加一个新行。 csv 客户端可能会忽略该行。我在想它可能已经存在这样的机制了

标签: php csv export-to-csv fputcsv


【解决方案1】:

CSV 规范没有为任何类型的文件完整性检查留出空间。因此,如果您希望 CSV 解析器能够自动处理某些内容,那么您不能。部分问题在于没有真正的 CSV 规范,并且根据我的经验,不同的解析器对 CSV 含义的定义略有不同。无论哪种方式,CSV“规范”中都没有内置完整性检查,您可以期望任何 CSV 解析器自动注意到。在末尾添加一些内容将使最终用户有机会自己验证文件,但我再次怀疑是否有人真的会费心检查。

一种可能的选择是将内容长度与文件一起发送。然后,当总内容与预期的内容不匹配时,浏览器可能会检测到下载中断。但是,那里的确切行为可能因浏览器而异,您必须运行一些测试以查看这是否真的有用。

但是,这也需要您事先知道文件的长度,这意味着将其全部构建在内存中,测量大小,然后转储到浏览器。这本身也有一些缺点,包括您受到内存大小的限制(尽管您可以使用 php://temp 缓解这种情况)。此外,在文件完全构建之前,下载不会开始,如果用户认为下载被冻结,则可能会导致更多取消。

一个完全不同的解决方案是将文件内容写入磁盘(在后台),然后在构建文件时通过电子邮件向用户发送下载链接。这样他们就不会等待您的下载脚本,实际下载将只是由您的网络服务器直接管理的简单文件下载,这将更快且更不容易出错。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多