Überprüfen Sie, ob der Download abgeschlossen ist

Was ist der beste Weg, um festzustellen, ob ein Download abgeschlossen ist, weil ich später die database aktualisieren will.

Ich habe einen Teil dieses Codes aus dem PHP-Handbuch ausprobiert, aber das tut mir nicht viel:

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 } 

   

Das sagt Ihnen nicht wirklich, ob der Download für den Benutzer abgeschlossen ist. Es wird Ihnen sagen, wenn Sie mit dem Senden von Bytes an den Benutzer fertig sind, aber es sagt nichts darüber aus, wie viele von ihnen der Benutzer tatsächlich erhalten hat.

In Wirklichkeit gibt es bei PHP (das ist eine serverseitige, nicht eine clientseitige Sprache) keine Möglichkeit, wirklich zu erkennen, wenn ein Dateidownload abgeschlossen ist. Das Beste, was Sie tun können, ist, den Download in Ihrer database zu protokollieren, wenn er beginnt. Wenn Sie absolut, vollständig und vollständig wissen müssen, wann der Download abgeschlossen ist, müssen Sie etwas wie ein Java-Applet einbetten oder Flash verwenden. Dies ist jedoch normalerweise nicht die richtige Antwort in Bezug auf die Benutzerfreundlichkeit für Ihren Benutzer (warum benötigen sie Java oder Flash, nur um etwas von Ihnen herunterzuladen?).

Wie Marc W bereits erwähnt hat, kann php Ihnen nur sagen, was Sie vom Server gesendet haben, nicht, was der Client erhalten hat, also ist die Verwendung von php ein Nicht-Starter.

Es besteht jedoch immer die Möglichkeit, den Benutzer zu bitten, den Download zu bestätigen, indem er auf eine Schaltfläche klickt, die eine JS-Prüfung aufruft, indem er einen MD5-Hash generiert und diesen mit dem MD5-Hash der Datei auf dem Server vergleicht (das MD5 auf dem Server wird generiert) Sie), und bei einem erfolgreichen Vergleich verwenden Sie dieses JS-Skript, um Ihre database zu aktualisieren, oder verwenden Sie sie, um ein PHP-Skript aufzurufen, um dasselbe zu tun.

Sie könnten immer nur darum bitten, den Download zu überprüfen, was sie erwartet haben, und wenn sie “ja, es ist in Ordnung” sagen, dann aktualisieren Sie die database.


Bearbeitet: als Antwort auf OPs Kommentar.

Danke, aber Sie können sich nicht auf die Benutzerfreundlichkeit verlassen. Weil sie auch für den Download bezahlen müssen, ist es besser, dass ich alle Kontrolle habe. Ich denke, ich werde dann die database aktualisieren, wenn auf das Skript zugegriffen wird. Das scheint dann am verlässlichsten zu sein.

Wie wäre es mit einem Ajax-Steuerelement, um den Download zu initiieren und zu verwalten, und nach Abschluss der Integritätsprüfung und der Aktualisierung der database?

Ich würde vorschlagen, nicht automatisch davon auszugehen, dass Ihre Kunden Sie abzocken werden, egal, was Sie letztendlich wählen. Frag sie gut, hat es für dich funktioniert? und wenn nicht, könnte das zu einem Bug-Report für Sie und sie nützlich sein.

Aber auch wenn einige Ihrer Benutzer nur für die zusätzliche Kopie “Nein” sagen, müssen Sie die Kosten dafür auf die Kosten Ihrer erhöhten Arbeitslast abwälzen, um zu verhindern, dass dies geschieht. Wenn die Kosten für die Aufrechterhaltung der “Ehrlichkeit” die potenziellen / wahrscheinlichen Kosten einer zusätzlichen Kopie übersteigen, dann hat das wenig Sinn.

Ich glaube nicht, dass es via php möglich ist zu wissen, wie viele Bissen gesendet wurden (und tatsächlich über den Client heruntergeladen wurden), da es keine Möglichkeit gibt zu wissen, ob der Benutzer den Download abgebrochen oder die gesamte Datei erhalten hat.

Es gibt eine Lösung, wenn Sie PHP (für serverseitigen Aufruf) ein Javascript (für Client abgeschlossen Anruf) mischen.

Sehen Sie sich diese Antwort an, um zu ermitteln, wann der Browser den Dateidownload erhält

Ich bin mir ziemlich sicher, dass Sie so ein gutes Ergebnis haben können. Ich hoffe, das hilft anderen, Mike

Der folgende Code funktioniert. Wenn der Download vom Client gestoppt wird, wird die database nicht aktualisiert und der Link kann erneut ausgetriggers werden.

  $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;