检测下载是否完成的最佳方法是什么,因为之后我想更新数据库。
我尝试了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
}
答案 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;