Правильная настройка заголовков, чтобы файл мог быть загружен через прокси с использованием PHP - PullRequest
0 голосов
/ 18 октября 2010

Мне трудно правильно сформулировать этот вопрос, позвольте мне попытаться объяснить нашу проблему ...

У нас есть интрасеть, работающая на коробке Ubunutu с Apache2 / PHP 5.2.4.У нас есть немного кода PHP, который читает файл из каталога, который не является общедоступным, и выводит его на экран (код ниже):

$file_path = '/home/path/to/filename.gif';

if(file_exists($file_path)){
    $output = FALSE;

    //File Information
    $path_parts = pathinfo($file_path);
    $file_size = filesize($file_path);
    $file_ext = (isset($path_parts['extension'])) ? strtolower($path_parts['extension']) : null;    
    $file_name = $path_parts['basename'];        

    //Sets up the headers    
    if($file_size > 0){
        header('Content-Length: ' .$file_size);
    }                    
    header('Content-Disposition: attachment; filename="'.$file_name.'"');
    header('Content-Type: application/octet-stream');


    //Reads the File
    if($file_size > 0){
        $handle = fopen($file_path, "r");
        $output = fread($handle, $file_size);
        fclose($handle);
    }

    //Outputs the File
    echo $output;
}

Внутри нашей сети при переходе на страницу, которая используетэтот код, файл загружается идеально и быстро ... Однако при доступе к этой странице через нашу Cisco ASA / Proxy / VPN (не знаю, как ее назвать) этот код блокирует браузер, но в конечном итоге загружает файл ...

После небольшого количества экспериментов, после удаления заголовков и простого вывода содержимого файла в браузер, он не печатает никаких проблем.Однако, как только я добавляю строки с заголовками обратно в код, это снова вызывает зависание, но только при доступе через это поле.

Кто-нибудь сталкивался с этой проблемой раньше или имеет представление о том, что мы можем попробоватьдвигаться вперед?

Спасибо за любой совет ...

Ответы [ 2 ]

0 голосов
/ 19 октября 2010

Очевидно, что у вашего прокси есть проблемы с Content-Type: application / octet-stream.Попробуйте установить для него реальный MIME-тип каждого файла.Вы можете использовать модуль Fileinfo , чтобы узнать MIME-тип определенного файла, например:

//You may need to specify the location of your system's magic file
//See http://php.net/finfo_open for more info
$finfo = new finfo(FILEINFO_MIME);
$mimetype = $finfo->file($file_path);
0 голосов
/ 18 октября 2010

Вы пытались полностью удалить заголовок с размером контента? Прокси-сервер может воспринимать это как твердое обещание, и если отправляемые вами данные оказываются другого размера, прокси-сервер может ожидать появления последних нескольких «пропущенных» байтов.

Так же, как в стороне, вы должны использовать [readfile()][1] вместо конструкции fopen () / fread () / echo, которая у вас есть сейчас.

В нынешнем виде вы выкладываете содержимое всего файла в память, а затем выводите его. Для больших файлов и нескольких запросов вы убьете сервер с нехваткой памяти. readfile автоматически передает файл небольшими порциями, поэтому использование памяти минимально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...