vérifiez si le téléchargement est terminé
Quelle est la meilleure façon de détecter si un téléchargement est terminé, parce que par la suite je veux mettre à jour la base de données.
J'ai essayé un peu de ce code, le manuel PHP, mais il ne fait pas beaucoup pour moi:
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
}
im trouvé une bonne solution mise en place en pur PHP: bytes.com/topic/php/answers/...
OriginalL'auteur Richard | 2009-10-13
Vous devez vous connecter pour publier un commentaire.
Qui n'est pas vraiment vous dire si le téléchargement est terminé pour l'utilisateur. Il vous dira quand vous ont terminé l'envoi d'octets pour l'utilisateur, mais il ne dit rien sur la façon dont beaucoup d'entre eux, l'utilisateur a effectivement reçu.
En réalité, il n'y a aucune manière avec le PHP (qui est côté serveur, pas côté client, de la langue) pour vraiment détecter si un fichier de téléchargement est terminé. Le meilleur que vous pouvez faire est de connecter le télécharger dans votre base de données lorsque l'on commence. Si vous avez absolument, complètement et totalement besoin de savoir quand le téléchargement est terminé, vous aurez à faire quelque chose comme intégrer une applet Java ou Flash. Cependant, habituellement ce n'est pas la bonne réponse en termes de facilité d'utilisation pour votre utilisateur (pourquoi les obliger à Java ou Flash installé juste à télécharger quelque chose de vous?).
php.net/function.ignore_user_abort - php.net/connection_aborted
pour connection_aborted de la doc : Lors de l'exécution de PHP un script de ligne de commande uniquement (ats).
OriginalL'auteur Marc W
Marc W l'a déjà souligné php peux seulement vous dire ce que vous avez envoyés à partir du serveur, et non pas ce que le client a reçu, donc, en utilisant strictement php est un non-starter.
Mais il y a toujours la possibilité de demander à l'utilisateur de confirmer le téléchargement en appuyant sur un bouton qui appelle un JS vérifier par générer un hachage MD5 et en comparant le hachage MD5 du fichier sur votre serveur (le serveur MD5 générée par vous), et sur le succès de la comparaison de l'utilisation que JS script pour mettre à jour votre base de données ou de l'utiliser pour appeler un script php à faire de même.
Vous pouvez toujours juste leur demander de vérifier le téléchargement est ce qu'ils attendaient et, si ils ont frappé "oui, c'est bien", puis mise à jour de la base de données.
Édité: en réponse à des OP commentaire.
Comment sur l'utilisation d'un contrôle Ajax pour initier et maintenir le téléchargement, et, à la fin de la vérification de son intégrité et de l'exécution d'une mise à jour de votre base de données?
Je vous suggère de ne pas automatiquement en supposant que vos clients vont vous arnaquer, même si, ce que vous finissent par choisir. En demandant gentiment", n'a-il travailler pour vous? " et, si non, conduisant à un bug-report pourrait être utile pour vous et pour eux.
Mais, peu importe, si certains de vos utilisateurs peuvent dire " non " juste pour la copie supplémentaire que vous avez à équilibrer le coût de que contre le coût de votre charge de travail accrue pour les empêcher. Si le coût de l'entretien de l'honnêteté dépasse le potentiel/coût probable de leur prendre une copie supplémentaire, alors il y a peu de point.
Merci pour votre apport supplémentaire, mais vous avez exécuté sur le fait que vous avez mentionné qu'il y a un ajax. Avez-vous un exemple?
Malheureusement, je n'ai pas. Je ne sais pas JS/jQuery/Ajax assez bien pour offrir une solution. Il pourrait être utile de votre modification de votre question initiale à inclure une demande -et re-tag - pour Ajax, JS et/ou jQuery solutions. Je suis désolé je ne peux pas être plus utiles pour vous.
OriginalL'auteur David Thomas
Je ne pense pas que c'est possible via php pour savoir comment beaucoup de morsures ont été envoyés (et effectivement téléchargé par le client), car il n'y a aucun moyen de savoir si l'utilisateur a annulé le téléchargement ou reçu le dossier complet.
Aussi un proxy à l'utilisateur final peut terminer le téléchargement, même si l'utilisateur a annulé
merci, Gnibbler. Alors que tout est dit. Ce n'est pas un moyen fiable.
OriginalL'auteur Ben Rowe
Il existe une solution si vous sont un mélange de php (pour le côté serveur d'appel ) un javascript (client complet d'appel) .
Look de cette réponse sur la façon de Détecter lorsque le navigateur reçoit le dossier de téléchargement
Je suis sûr que vous pouvez avoir un bon résultat de ce genre.
J'espère que cela aidera d'autres personnes,
Mike
OriginalL'auteur Mike
Le code suivant fonctionne. Si le téléchargement est interrompu par le client, la base de données n'est pas mise à jour et le lien peut tirer de nouveau.
readfile
ne peut pas dire si l'utilisateur a annulé. Il renvoie sans erreur, en supposant que le fichier est assez petit pour tenir dans la mémoire tampon de sortie en une seule fois, puis le code de produit à la base de données mise à jour. Rien n'est propagée vers le haut à partir de la couche TCP pour indiquer que la livraison de l'autre côté de la pipe.Cela ne fonctionne pas comme ça.
Cela ne fonctionne plus.
OriginalL'auteur Francois