Здравствуйте
на сервере есть папка sources, на нее установлен запрет для прямого обращения, то есть если перейти по адресу site.com/sources получим ошибку 403
В этой папке лежат архивы zip
Как средствами PHP можно скачать файл к примеру site.com/sources/file.zip без прямого обращения к файлу?
прошу помощи в реализации!
function file_force_download($file) {
if (file_exists($file)) {
// сбрасываем буфер вывода 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($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
// читаем файл и отправляем его пользователю
readfile($file);
exit;
}
}
Здесь $file
- путь к файлу (например, "sources/file.zip"). Источник и другие способы
Добавление по безопасности от заботливого @TotalPusher
Добавить проверку на ../
, или берите только имя файла pathinfo($_GET['file'], PATHINFO_BASENAME)
, и на одну уязвимость будет меньше.
Попробуйте полный путь ввести, если все запросы не слиты на определённый файл, то может получиться хоть и 403
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Допустим есть файл texttxt, как сделать чтобы после чтения файла его содержимое было очищено?
Сейчас через python тяну api с нужного мне url и вставляю распарсенные строки в таблицу в PostgresПроцесс долгий, ёмкий и не работает без моих рук
Как вывести все значения ["amount"]=> int(1) а именно значение 1 из всего массива?
Есть ли в этом коде какая-либо ошибка? Есть таблица products и столбик confirmПри добавлении LIMIT не открывается страница