PHP и AJAX счетчик загрузки файлов: как узнать загрузил ли пользователь файл?

интернет программирование php AJAX счетчик загрузки файлов

Друзья!
Счетчик написан на PHP и AJAX. При нажатии на кнопку «Download» счетчик инкрементируется на 1 и высылает пользователю файл на сохранение. Статистика скачиваний хранится в текстовом файле "download-stat/01.stat" на сервере. Данные из файла считываются 1 раз при загрузке страницы. При нажатии кнопки «Download» файл download.html инкрементирует счетчик, а файл get.php выдает ссылку на скачивание. Файлы для загрузки – картинки из папки pictures, кот. называются 01.jpg, 02.jpg и т.д.

index.html

<script src="prototype.js"></script>

<span style="font-weight:bold;" id="result01"><script language="php">
$filename = "download-stat/01.stat"; //статистика по картинке 01.jpg
if(file_exists($filename))
{
$file = fopen($filename,"rb");
flock($file,LOCK_EX);
$content = fread($file,filesize($filename));
fclose($file);
echo($content);
}</script></span><br />
<form id="myform">
<input type="button" onclick="dosubmit('01')" value="Download">// 01.jpg - картинка, кот. //будем загружать
</form>
<script language="javascript">
function dosubmit(num) {
new Ajax.Updater( 'result'+num, 'download.html?filename='+num, { method: 'post',
parameters: $('myform').serialize() } );
form = document.createElement("form");
form.method = "POST";
form.action = '[адрес_сайта]/get.php?filename='+num;
form.target = "_self";
document.body.appendChild(form);
form.submit();
}
</script>
……..

Файл prototype.js реализует функции AJAX, т.е. динамически записывает данные в <span style="font-weight:bold;" id="result01"></span> на странице index.html

download.html
<script language="php">
$file = "pictures/".$_GET['filename'].".jpg";
if (file_exists($file)) {
$stat_file_path = "download-stat/".$_GET['filename'].".stat";
$file_stat = fopen($stat_file_path,"r");
flock($file_stat,LOCK_EX);
$count = fread($file_stat,filesize($stat_file_path));
fclose($file_stat);
$count++;
$file_stat = fopen($stat_file_path,"w");
fwrite($file_stat,$count);
flock($file_stat,LOCK_UN);
fclose($file_stat);
echo($count);
exit();
}
</script>

get.php
<?php
$file = "pictures/".$_GET['filename'].".jpg";
header('Content-Description: File Transfer');
header('Content-Type: image/jpeg');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
?>



Счетчик работает, но вот вопрос: если в диалоге загрузки файла пользователь откажется от загрузки, счетчик все равно засчитает загрузку. Т.е. фактически считаются нажатия на кнопку “Download”.
Нужно каким-то образом узнать закачал ли юзер файл и инкрементировать счетчик только в этом случае.

Пытался как-нибудь с помощью PHP отслеживать был ли отдан файл, менять последовательность(сначала выдача ссылки на загрузку, а потом инкрементирование ) и даже искал отданные файла в access.log файле статистики Apache сервера. Пока ничего не получилось.

Буду рад любым вашим идеям!
Заранее благодарен


Примечание:
fluid: счетчик работает, но по возвращаемым значениям echo file_get_contents($filename); также как и по readfile($file); нельзя определить был ли файл действительно скачан пользователем и сохранен...
Ответы:
О том, скачан ли файл, знает только браузер и больше никто. Поэтому надо качать файл яваскриптом, а потом им же посылать ajax запрос на сервер, подтверждающий, что файл принят. Но все это бессмысленно, так как сама постановка задачи неверна. Если ты ограничиваешь пользователя количеством файлов, которые он может скачать, надо, чтобы он имел возможность скачать любой разрешенный файл больше одного раза. Если ты ограничиваешь пользователя потребленным трафиком, то такой скрипт тем более не нужен, потому что нажатая кнопка cancel становится личной проблемой пользователя - траффик все равно потреблен. Если тебе просто нужен счетчик скачек, то не парься - абсолютно точно все равно не посчитаешь.
Вообще можно с помощью пхп отдавать файл...
шлешь хэдеры что это файл считываешь и делаешь echo, по завершению инкрементируем счетчик
примерно так:
можно проверять размер байт сколько было отравлено и размер файла...
вообще на самом деле не суть скачал полностью или нет..


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.