проверить, завершена ли загрузка

Мой вопрос: какой наилучший способ определить, завершена ли загрузка, потому что после этого я хочу обновить базу данных.

Я попробовал некоторые из этого кода с php manuel, но это не делает для меня многого.

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 } 

спасибо в adv, Ричард

На самом деле это не означает, что загрузка завершена для пользователя. Он расскажет вам, когда вы закончите отправлять байты пользователю, но он ничего не говорит о том, сколько из них фактически получил пользователь.

На самом деле, нет способа с PHP (который является серверным, а не клиентским, языком), чтобы действительно обнаружить, когда загрузка файла завершена. Лучшее, что вы можете сделать, это зарегистрировать загрузку в своей базе данных, когда она начнется. Если вы абсолютно, полностью и полностью должны знать, когда загрузка будет завершена, вам придется сделать что-то вроде встраивания апплета Java или использования Flash. Однако, как правило, это неправильный ответ с точки зрения удобства использования для вашего пользователя (зачем требовать от них наличия Java или Flash для загрузки чего-либо от вас?).

Как уже указывал Marc W, php может только сообщать вам, что вы отправили с сервера, а не то, что получил клиент, поэтому использование строго php является не стартером.

Но всегда есть возможность попросить пользователя подтвердить загрузку, нажав кнопку, которая вызывает проверку JS, создавая хэш MD5 и сравнивая это с хешем MD5 файла на вашем сервере (MD5 на сервере, генерируемый вы), и при успешном сравнении используйте этот JS-скрипт для обновления своего db или используйте его для вызова php-скрипта, чтобы сделать то же самое.

Вы всегда можете просто попросить их проверить, что загрузка – это то, что они ожидали, и, если они нажмут «да, это нормально», то обновите базу данных.


Отредактировано: в ответ на комментарий OP.

Спасибо, но вы не можете зависеть от взаимодействия пользователей. Поскольку они также должны платить за скачивание, лучше, что у меня есть все controll.I думаю, что я буду обновлять базу данных, когда к сценарию будет доступ. Тогда это кажется самым надежным.

Как насчет использования элемента управления Ajax для запуска и поддержки загрузки, а при завершении проверки его целостности и выполнения обновления для вашего db?

Я бы посоветовал не автоматически предполагать, что ваши клиенты будут разорвать вас, хотя, что бы вы ни выбрали. С удовольствием спросил их: «Это сработало для вас?» и, если нет, это приведет к тому, что отчет об ошибке будет полезен для вас и для них.

Но, несмотря на то, что некоторые из ваших пользователей могут сказать «нет» только для дополнительной копии, вам придется балансировать стоимость этого с затратами на увеличенную рабочую нагрузку, чтобы предотвратить ее появление. Если стоимость поддержания «честности» превышает потенциальную / вероятную стоимость их получения дополнительной копии, то есть мало смысла.

Я не думаю, что через php возможно узнать, сколько укусов было отправлено (и фактически загружено через клиента), поскольку нет способа узнать, отменил ли пользователь загрузку или получил весь файл.

Существует решение, если вы смешиваете php (для вызова на стороне сервера) javascript (для полного вызова клиента).

Посмотрите этот ответ о том, как определить, когда браузер загружает файлы

Я почти уверен, что у вас получится такой хороший результат. Надеюсь, это поможет другим, Майк

Следующий код работает. Если загрузка остановлена ​​клиентом, база данных не обновляется, и ссылка может возобновиться снова.

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