В этом примере покажу, как можно отдать пользователю файл при клике по ссылке, используя php.
Иногда есть необходимость скрыть истинное расположение файла, или, к примеру, вы хотите подсчитывать количество скачиваний файла. Как вариант, приведу код, который рассчитан на скачивания файлов, которые имеют название, написанными латинскими или русскими буквами.
У нас есть ссылка:
1 2 3 |
<a href="/getfile.php?f=archive.rar>Архив.rar</a> |
Мы по ней кликаем, и у нас идет обращение к файлу getfile.php, где мы, через переменную f, передаем файл, который хотим скачать. Что передавать,и в каком виде, это уже решать вам.
Теперь обработаем запрос, и вернем файл пользователю
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php $dir=$_SERVER['DOCUMENT_ROOT']; $file=$dir.'/'.urldecode($_GET['f']); download($file); function download($file){ if (file_exists($file)) { if (ob_get_level()) { ob_end_clean(); } //Получаем название файла preg_match('/.*\/(.*+)$/iu',$file,$name); $name=char($name[1]); // header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' .$name); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); readfile($file); exit; } else{ echo 'Не могу найти файл: '.$file; } } function char($name) { $text=@iconv('utf-8','cp1251',$name); return $text; } ?> |
При создании ссылки, где в названии фала, могут быть русские буквы, необходимо сформировать название файла с помощью urlencode();
Вместо кода:
1 2 3 4 |
preg_match('/.*\/(.*+)$/iu',$file,$name); $name=char($name[1]); |
Можно применить basename($file), и тогда функцию char() можно исключить. Это делалось исключительно под русские названия, и для пользователей работающих на Windows.