Внимание, это пример того, как делать не нужно!
Данный пример кода читает файлы и "выплёвывает" их на скачивание браузеру. Все работает, но есть проблема - безопасность. Путь до файла передается просто в формате base64, но этот никак не помешает потенциальному взломщику поправить входной параметр так, чтобы получить любой файл с Вашего сервера (включая конфигурационный и системные)!
<?
class soDownload
{
public function fDownload()
{
//$sFile = c_Request::GetParam('fn', '');
$sFile = isset($_REQUEST['fn'])?isset($_REQUEST['fn']):'';
if($sFile)
{
//$sFile = $mosConfig_absolute_path.base64_decode($sFile);
$sFile = $_SERVER['DOCUMENT_ROOT'].base64_decode($sFile);
if (file_exists($sFile))
{
// сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
// если этого не сделать файл будет читаться в память полностью!
if (ob_get_level())
{
ob_end_clean();
}
// заставляем браузер показать окно сохранения файла
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($sFile));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($sFile));
// читаем файл и отправляем его пользователю
if ($fd = fopen($sFile, 'rb'))
{
while (!feof($fd))
{
print fread($fd, 1024);
}
fclose($fd);
}
exit;
}
}
}
}
Todo: добавить фильтрацию и проверку пути!