PHP делает счетчик загрузки, не выходя из текущей страницы

Я попытался создать счетчик загрузки с PHP. Сценарий, который я создал, работает, но когда я нажимаю ссылку для загрузки, сценарий отправляет меня на пустую страницу. Можно ли оставаться на странице во время загрузки и подсчета?

Вот мой код моего файла download.php:

<?php $Down=$_GET['Down']; ?> <html> <head> <meta http-equiv="refresh" content="0;url=<?php echo $Down; ?>"> </head> <body> <?php $fp = fopen("counter.txt", "r"); $count = fread($fp, 1024); fclose($fp); $count = $count + 1; $fp = fopen("counter.txt", "w"); fwrite($fp, $count); fclose($fp); ?> </body> </html> 

Вот как выглядит ссылка в моем index.php:

 <a href="download.php?Down=download.zip">download</a> 

Спасибо заранее!

Хорошо, поскольку у вас большая часть недостающего кода здесь является примером, в основном вам нужно вызвать код счетчика внутри файла download.php и передать содержимое файла после выполнения кода счетчика и установки заголовков загрузки. также опасайтесь или позволяйте злоумышленникам загружать любой файл с вашего сервера, просто передав имя файла функции загрузки. download.php?file=index.php ect

 <?php function get_download_count($file=null){ $counters = './counters/'; if($file == null) return 0; $count = 0; if(file_exists($counters.md5($file).'_counter.txt')){ $fp = fopen($counters.md5($file).'_counter.txt', "r"); $count = fread($fp, 1024); fclose($fp); }else{ $fp = fopen($counters.md5($file).'_counter.txt', "w+"); fwrite($fp, $count); fclose($fp); } return $count; } ?> <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title></title> </head> <body> <a href="./download.php?file=exampleA.zip">exampleA.zip</a> (Downloaded <?php echo get_download_count('exampleA.zip');?> times)<br> <a href="./download.php?file=exampleB.zip">exampleB.zip</a> (Downloaded <?php echo get_download_count('exampleB.zip');?> times)<br> </body> </html> 

download.php, поскольку вы можете видеть, что он не выводит HTML, так как это может повредить файл.

 <?php //where the files are $downloads_folder = './files/'; $counters_folder = './counters/'; //has a file name been passed? if(!empty($_GET['file'])){ //protect from people getting other files $file = basename($_GET['file']); //does the file exist? if(file_exists($downloads_folder.$file)){ //update counter - add if dont exist if(file_exists($counters_folder.md5($file).'_counter.txt')){ $fp = fopen($counters_folder.md5($file).'_counter.txt', "r"); $count = fread($fp, 1024); fclose($fp); $fp = fopen($counters_folder.md5($file).'_counter.txt', "w"); fwrite($fp, $count + 1); fclose($fp); }else{ $fp = fopen($counters_folder.md5($file).'_counter.txt', "w+"); fwrite($fp, 1); fclose($fp); } //set force download headers header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$file.'"'); header('Content-Transfer-Encoding: binary'); header('Connection: Keep-Alive'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . sprintf("%u", filesize($downloads_folder.$file))); //open and output file contents $fh = fopen($downloads_folder.$file, "rb"); while (!feof($fh)) { echo fgets($fh); flush(); } fclose($fh); exit; }else{ header("HTTP/1.0 404 Not Found"); exit('File not found!'); } }else{ exit(header("Location: ./index.php")); } ?> 

Убедитесь, что вы правильно $downloads_folder переменную $downloads_folder . Надеюсь, поможет.

Загрузить полный пример кода.

Попробуйте использовать перенаправление заголовка php вместо перенаправления JS или метатега:

 <?php //counter code $fp = fopen("counter.txt", "r"); $count = fread($fp, 1024); fclose($fp); $count = $count + 1; $fp = fopen("counter.txt", "w"); fwrite($fp, $count); fclose($fp); // redirect header("location: ".$_GET["Down"]); exit; 

Также убедитесь, что перед заголовком ничего не выводится.

http://www.php.net/manual/en/function.header.php

Также для ссылки, если она все еще не работает, попробуйте добавить целевое attr:

 <a href="download.php?Down=download.zip" target="_new">download</a> 

Я хотел бы улучшить ответ Лоуренса Чермона. Счетчик загрузки imho должен быть прозрачным, поэтому он более безопасен, и никто не должен иметь доступ непосредственно к скриптам php. Наконец, я интегрировал jquery, поэтому счетчик обновляется в реальном времени с помощью ajax … поэтому нет необходимости перезагружать страницу, чтобы увидеть результаты …

.htaccess (находится в корне / файлах /)

 RewriteEngine on RewriteRule ^(.*).(rar|zip)$ /php/doing_download.php?file=$1.$2 [R,L] 

do_download.php (находится в корневом каталоге / php)

 <?php $downloads_folder = $_SERVER['DOCUMENT_ROOT'] . '/files/'; $counters_folder = $_SERVER['DOCUMENT_ROOT'] . '/files/counter/'; if (!empty($_GET['file'])) { $file = basename($_GET['file']); $type = array("zip", "rar"); $exts = strtolower(substr(strrchr($file, "."), 1)); if (!in_array($exts, $type)) { header("HTTP/1.0 403 Forbidden"); exit('File not allowed!'); } else { if (file_exists($downloads_folder . $file)) { if (file_exists($counters_folder . md5($file) . '_counter.txt')) { $fp = fopen($counters_folder . md5($file) . '_counter.txt', "r"); $count = fread($fp, 1024); fclose($fp); $fp = fopen($counters_folder . md5($file) . '_counter.txt', "w"); fwrite($fp, $count + 1); fclose($fp); } else { $fp = fopen($counters_folder . md5($file) . '_counter.txt', "w+"); fwrite($fp, 1); fclose($fp); } header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $file . '"'); header('Content-Transfer-Encoding: binary'); header('Connection: Keep-Alive'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . sprintf("%u", filesize($downloads_folder . $file))); $fh = fopen($downloads_folder . $file, "rb"); while (!feof($fh)) { echo fgets($fh); flush(); } fclose($fh); exit; } else { header("HTTP/1.0 404 Not Found"); exit('File not found!'); } } } ?> 

count_download.php (находится в корне / php /)

 <?php function get_download_count($file = null) { $counters = $_SERVER['DOCUMENT_ROOT'] . '/files/counter/'; if ($file == null) return 0; $count = 0; if (file_exists($counters . md5($file) . '_counter.txt')) { $fp = fopen($counters . md5($file) . '_counter.txt', "r"); $count = fread($fp, 1024); fclose($fp); } else { $fp = fopen($counters . md5($file) . '_counter.txt', "w+"); fwrite($fp, $count); fclose($fp); } return $count; } ?> 

call_download.php (находится в корневом каталоге / php)

 <?php include($_SERVER["DOCUMENT_ROOT"] . "/php/count_download.php"); $item['item1'] = get_download_count('exampleA.zip'); $item['item2'] = get_download_count('exampleB.zip'); echo json_encode($item); ?> 

static_download.php (находится в корневом каталоге / php)

 <?php include($_SERVER["DOCUMENT_ROOT"] . "/php/count_download.php"); $item['item1'] = get_download_count('exampleA.zip'); $item['item2'] = get_download_count('exampleB.zip'); ?> 

download.js (находится в корневом каталоге / jsc /)

 $(document).ready(function() { $.ajaxSetup({cache: false}); getStatus(); }); function getStatus() { $.getJSON('php/call_download.php', function(data) { $('#item1').html(data.item1); $('#item2').html(data.item2); }); setTimeout("getStatus()",1000); } 

index.php (находится в корневом каталоге)

 <?php include($_SERVER["DOCUMENT_ROOT"] . "/php/static_download.php"); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Download Page</title> <script type="text/javascript" src="jsc/jquery.min.js"></script> <script type="text/javascript" src="jsc/download.js"></script> </head> <body> File: <a href="files/exampleA.zip">exampleA.zip</a>&nbsp; - &nbsp;Downloaded <span id="item1"><?php echo $item['item1']; ?></span> Times<br /> File: <a href="files/exampleB.zip">exampleB.zip</a>&nbsp; - &nbsp;Downloaded <span id="item2"><?php echo $item['item2']; ?></span> Times<br /> File: <a href="test/test.zip">test.zip</a><!-- this file never will be counted since is located in other folder --><br /> </body> </html> 

Здесь вы можете скачать все файлы и протестировать их!

Надеюсь, мой ответ, основанный на ответе Лоуренса Черей, решит любую проблему 🙂 @Lawrence Cherone: отличная работа !!!