PDA

Просмотр полной версии : Счетчик закачек на пхп



Tyler Durden
21.06.2005, 11:54
Написал вот простейший счетчик закачек:

<?
$counter_file="counter/".$file.".txt";
if&#40;$contents=@file&#40;$counter_file&#41;&#41;&#123;
$count=$contents&#91;0&#93;+1;
&#125;else&#123;
$count=1;
&#125;
$f=fopen&#40;$counter_file,"w"&#41;;
fwrite&#40;$f,$count&#41;;
fclose&#40;$f&#41;;
header&#40;"location&#58; /$file"&#41;;
?>
Файл-то он отдает, закачки считает, только имя у файла "download.zip" (если пользуешься Opera) или "download.php" (если IE)... Менеджеры закачек все нормально обрабатывают, чего делать ?

П.С. Если не трудно, кто хорошо знает кросс-браузерный хтмл, можете посмотреть
http://tylerdurden.net.ru/guestbook.php почему в IE "разъезжаются рамочки от input'ов (в Opera все ок-об)
Спасибо.

iFog
22.06.2005, 10:55
header("Content-Disposition: attachment; filename=myfile.zip");

iFog
22.06.2005, 10:59
А, не посмотрел на твой код, т.е. ты просто считаешь количество переходов.

Ну, если так он подставляет не корректное имя файла, то попробуй редиректить пользователя не заголовком (это вообще не очень хорошо), а таким способом


echo '<META HTTP-EQUIV="refresh" CONTENT="0; URL=/files/file.zip">';

iFog
22.06.2005, 11:02
Вообще, так как ты редиректишь пользователя туда, где файл лежит физически, то твою "считалку" легко обойти. Отдавай файл скриптом...


<?

$file_name = './who.zip';

if &#40;!file_exists&#40;$file_name&#41;&#41; &#123;
header &#40;"HTTP/1.0 404 Not Found"&#41;;
exit;
&#125;

$fsize = filesize&#40;$file_name&#41;;
$ftime = date&#40;"D, d M Y H&#58;i&#58;s T", filemtime&#40;$file_name&#41;&#41;;

$file_handler = @fopen&#40;$file_name, "rb"&#41;;

if &#40;!$file_handler&#41; &#123;
header &#40;"HTTP/1.0 403 Forbidden"&#41;;
exit;
&#125;

if &#40;$HTTP_SERVER_VARS&#91;"HTTP_RANGE"&#93;&#41; &#123;

$range = $HTTP_SERVER_VARS&#91;"HTTP_RANGE"&#93;;
$range = str_replace&#40;"bytes=", "", $range&#41;;
$range = str_replace&#40;"-", "", $range&#41;;

if &#40;$range&#41; &#123;
fseek&#40;$file_handler, $range&#41;;
&#125;
&#125;


if &#40;$range&#41; &#123;
header&#40;"HTTP/1.1 206 Partial Content"&#41;;
&#125; else &#123;
header&#40;"HTTP/1.1 200 OK"&#41;;
&#125;

header&#40;"Content-Disposition&#58; attachment; filename=myfile.zip"&#41;;
header&#40;"Last-Modified&#58; $ftime"&#41;;
header&#40;"Accept-Ranges&#58; bytes"&#41;;
header&#40;"Content-Length&#58; ".&#40;$fsize-$range&#41;&#41;;
header&#40;"Content-Range&#58; bytes $range-".&#40;$fsize-1&#41;."/".$fsize&#41;;
header&#40;"Content-type&#58; application/octet-stream"&#41;;

while &#40;!feof &#40;$file_handler&#41;&#41; &#123;
echo fread&#40;$file_handler, 100&#41;;

&#125;


fclose&#40;$file_handler&#41;;
exit;

?>

Осталось добавить считалку. К стати теперь можнос читать, какой объем выкачал пользователь.
Простенький, но для начала может хватить.

Lord of rings
22.06.2005, 12:31
Я бы делал счетчик с учетом хостов, сливал бы всю информацию в MYSQL. Тогда была бы полная статистика

Tyler Durden
22.06.2005, 12:43
Спасибо... Правда сейчас еще не имею возможности проверить в полном объеме (чет на работе доступ тормозит :( ) Вариант с meta-тэгом не пашет, менеджеры качают его как html (именно ту страницу де прописан meta). MySQL для хомпаги ?! Я ж не microsoft с их гигантоманией.

Inferno
22.06.2005, 16:52
Делаешь линк на файл в пустую папку. Там помещаешь файл .htacсess, в котором на 404 ошибку прописываешь переадресацию на пхп скрипт. В скрипте выдашь нужный файл и инкрементируешь счетчик.

iFog
26.06.2005, 10:37
Лучше mod_rewrite, или forceType, иначе лог загадится =)