Друзья!
Счетчик написан на 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); нельзя определить был ли файл действительно скачан пользователем и сохранен...
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.