Скачивание файла без прямого обращения

261
03 апреля 2018, 01:03

Здравствуйте

на сервере есть папка sources, на нее установлен запрет для прямого обращения, то есть если перейти по адресу site.com/sources получим ошибку 403

В этой папке лежат архивы zip

Как средствами PHP можно скачать файл к примеру site.com/sources/file.zip без прямого обращения к файлу?

прошу помощи в реализации!

Answer 1
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), и на одну уязвимость будет меньше.

Answer 2

Попробуйте полный путь ввести, если все запросы не слиты на определённый файл, то может получиться хоть и 403

READ ALSO
Очистка файла после чтения

Очистка файла после чтения

Допустим есть файл texttxt, как сделать чтобы после чтения файла его содержимое было очищено?

211
получить api через php\js

получить api через php\js

Сейчас через python тяну api с нужного мне url и вставляю распарсенные строки в таблицу в PostgresПроцесс долгий, ёмкий и не работает без моих рук

240
Как вывести все значения массива?

Как вывести все значения массива?

Как вывести все значения ["amount"]=> int(1) а именно значение 1 из всего массива?

296
Ошибка в коде RedBeanPHP

Ошибка в коде RedBeanPHP

Есть ли в этом коде какая-либо ошибка? Есть таблица products и столбик confirmПри добавлении LIMIT не открывается страница

195