检查下载是否完成

时间:2009-10-13 22:03:06

标签: php download

检测下载是否完成的最佳方法是什么,因为之后我想更新数据库。

我尝试了PHP手册中的一些代码,但它对我没有太大帮助:

header("Content-Type: application/octet-stream"); 
header("Content-Length: ".filesize($file)); 
header("Content-Disposition: attachment; filename=$filename");

// buffered read not using readfile($file);

if ($fp = fopen($bestand, 'rb')) {
    while (!feof($fp)) {
        $buf = fread($fp, 4096);
        echo $buf;
        $bytesSent += strlen($buf);    /* We know how many bytes were sent to the user */
    }     
 }

if ($bytesSent == filesize($fp)) {
    //do something with db
}

5 个答案:

答案 0 :(得分:9)

这并不是真的会告诉你是否为用户完成了下载。它会告诉您何时已经完成向用户发送字节,但它没有说明用户实际接收了多少个字节。

实际上,没有办法用PHP(服务器端,而不是客户端语言)来真正检测文件下载何时完成。您可以做的最好的事情是在数据库开始时将数据库记录下来。如果您绝对,完全且完全需要知道下载何时完成,则必须执行诸如嵌入Java小程序或使用Flash之类的操作。但是,就用户的可用性而言,通常这不是正确的答案(为什么要求他们安装Java或Flash只是为了下载你的东西?)。

答案 1 :(得分:2)

正如Marc W已经指出php只能告诉你从服务器发送的内容,而不是客户端收到的内容,所以严格使用php是一个非首发。

但总是有可能要求用户通过按下调用JS检查的按钮来确认下载,方法是生成MD5哈希并将其与服务器上文件的MD5哈希值进行比较(服务器上的MD5)由您生成),并且在成功比较时使用该JS脚本来更新您的数据库或使用它来调用php脚本来执行相同操作。

您可以随时要求他们检查下载是否符合预期,如果他们点击“是的,那就没关系”,然后更新数据库。

<小时/> 已编辑:以回应OP的评论。

谢谢,但你不能依赖用户的合作。因为他们还必须为下载付费,所以我拥有所有控件更好。我想我会在访问脚本时更新数据库。那似乎是最可靠的。

如何使用Ajax控件启动并维护下载,并在完成时验证其完整性并对数据库运行更新?

我建议不要自动假设你的顾客会扯掉你,无论你最终选择什么。很好地问他们'这对你有用吗?'如果没有,导致错误报告可能对您和他们有用。

但是,无论如何,虽然您的一些用户可能只是为额外的副本说“不”,但您必须平衡其成本与增加的工作量成本以防止其发生。如果维持“诚实”的成本超过了他们获取额外副本的潜在/可能成本,那么就没有什么意义了。

答案 2 :(得分:1)

我认为通过php可以知道已经发送了多少次(实际上是通过客户端下载的),因为无法知道用户是取消了下载还是收到了整个文件。 / p>

答案 3 :(得分:0)

如果您将php(用于服务器端调用)与javascript(用于客户端完成调用)混合,则有一个解决方案。

查看关于如何Detect when browser receives file download

的答案

我很确定你能有这么好的结果。 我希望这有助于他人, 麦克

答案 4 :(得分:-4)

以下代码有效。如果客户端停止下载,则不会更新数据库,并且可以再次触发链接。

  $file='pathto.zip';

  header("Content-type: application/zip");
  header("Content-Disposition: attachment; filename=$file");
  header("Pragma: no-cache");
  header("Expires: 0");
  readfile("$file");

  $sql = "UPDATE YOUR TABLE"; 

  exit;