Безопасная загрузка файла в браузере с правильным именем файла

Я работаю над веб-сайтом, на котором есть безопасная область, доступная пользователям только после того, как они вошли в систему. В этой области есть страница со ссылками на документы в формате PDF, которые можно загрузить. Физические документы находятся за пределами корневого каталога веб-сайта. Ссылки на документы в формате PDF выглядят примерно так:

index.php? Страница = безопасная зона / загрузка и файл = protected.pdf

Который выполняет следующее (примечание: я знаю, что это способ заставить загрузку, а не открыть файлвнутри браузер):

// check security, get filename from request, prefix document download directory and check for file existance then...

header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Connection: Close');
set_time_limit(0);
readfile($file);

Это работает хорошо, но в Firefox 3 и Internet Explorer 7 (я не тестировал ни с одним другим браузером) не открывают этот файл внутри браузера, они оба показывают диалоговое окно загрузки (как и ожидалось). Если я выберу «Открыть», а не «Сохранить», документ будет загружен, и Adobe Reader будет запущен за пределами браузера для отображения документа.

У меня проблема с загрузкой файла в браузере и сохранением правильного имени файла по умолчанию.

Я хотел бы, чтобы документ открылся в браузере. Один из способов сделать это - использовать заголовок «Content-Disposition: inline;» но это означает, что я не могу указать имя файла (потому что оно, похоже, игнорируется браузером). Проблема в том, что когда я сохраняю документ, по умолчанию используется имя URL-адреса, а не имя файла PDF-документа:

http___example.com_index.php_page=secure_area_download&file=protected.pdf

Как заставить Firefox и Internet Explorer открыть документ в браузере и указать правильное имя файла по умолчанию для сохранения?

Ответы на вопрос(5)

Ваш ответ на вопрос