За последние 24 часа нас посетили 17856 программистов и 1716 роботов. Сейчас ищут 970 программистов ...

выдаем файлы из папки выше корня

Тема в разделе "Прочие вопросы по PHP", создана пользователем gimarus, 9 ноя 2014.

  1. gimarus

    gimarus Новичок

    С нами с:
    9 ноя 2014
    Сообщения:
    1
    Симпатии:
    0
    Коллеги, всех приветствую! Всем доброго здравия!

    Вот какая штука приключилась:
    Есть Облачная система, все пользователи заходят под Логином-Паролем,
    Используются сессии
    реальная структура такая
    scripts/
    htmldoc/
    files/

    index.php лежит , в htmldoc/ эта папка является корнем для доменного имени
    в папку files/ падают все файлы, с которыми идет некая работа
    в php-скриптах файл, стало быть, сохраняется (удачно) таким путем:

    $filecode=[тело файла из загрузки на сервер];
    $filename="название.расширение";
    // название - латинское название,
    // расширение - правильное расширение (.jpg, .pdf и т.д.)
    $f=fopen("../files/$filename","w");
    fwrite($f,$filecode);
    fclose($f);

    при сохранении файла ему присваивается уникальный индекс codefile с занесением в базу данных информации, кто из пользователей имеет к файлу право

    все файлы сохраняются корректно в ftp их видно, если их скачать по ftp, открываются как и должны.

    Теперь проблема:
    пользователи открывают файлы по ссылкам вида href="download.php?codefile",
    где download.php - это скрипт, лежащий в htmldoc/,
    а codefile - это индекс
    по задаче нужно, программно проверить имеет ли пользователь право на просмотр файла, и если имеет, то выдать ему в браузер этот файл

    вот часть download.php:
    не буду описывать проверку на "право" она работает, вот что после всех проверок:
    $f="../files/$file"; // путь + файл.расширение
    if (file_exists($f)) {
    include("../scripts/get_mime_type.include"); // скрипт определения mime_type
    $mime=get_mime_type($f); // работает правильно
    if (ob_get_level()) ob_end_clean();
    header("Content-Type: $mime");
    @readfile($f);
    }

    и вот какая штука:
    картинки прямо в браузере показываются,
    а .pdf - пустой белый лист выводит, даже не ругается
    .doc и .xls - браузер ругается: нет говорит такого файла, причем пишет "не могу найти файл site.ru/download.php?codefile"

    думаю, чего-то я не дописал в этот блок:
    if (ob_get_level()) ob_end_clean();
    header("Content-Type: $mime");
    @readfile($f);
    или вообще, может, нельзя выдать файл из-под "сверхкорня"?

    Кто, может сталкивался с подобной ситуацией,
    подскажите, пожалуйста, какие варианты решения
    Заранее, Спасибо!
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    можно откуда угодно, главное чтоб политика безопасности разрешала. повысьте уровень сообщений и почитайте что именно по поводу неработающих запросов сообщается в журнале ошибок.