Простой вопрос, возможно, задавался миллион раз, но я искал и не приблизился к тому, чтобы заставить это работать.
У меня есть PHP-скрипт в рамках UserFrosting, который передает файл пользователю через его браузер. Я хотел бы, чтобы файл открывался в их браузере, если они выбрали «Открыть» вместо загрузки.
Проблема в том, что правильно открываются только текстовые файлы. Все остальное (PDF и JPG, протестированные до сих пор) просто открываются как страница ASCII / искаженного кода, а не интерпретируются как PDF или изображение.
Вот код, который я использую:
header('Content-Type: '. $mime);
header('Content-Length: ' . filesize($diskname));
header('Content-Disposition: inline; filename=' . $savename);
return readfile($diskname);
$mime
тип Mime файла, установленного с помощью функции, поэтому может быть application/pdf
или же image/jpeg
для файлов, которые я пытаюсь просмотреть до сих пор.
У кого-нибудь есть идеи, почему файлы не открываются правильно?
ОБНОВИТЬ
Проверив заголовки ответа, я получаю тип контента text/html;charset=UTF-8
вместо application/jpeg
или же application/pdf
что он должен был быть установлен в соответствии с кодом, который я использую. Мне интересно, если это проблема UserFrosting?
Хорошо, проблема решена. Как я и подозревал, это было связано с фреймворком UserFrosting или, точнее, Slim.
Вместо настроек заголовки используют header('Content-Type: image/jpeg');
Я должен был сделать следующее:
$this->_app->response->headers->set('Content-Type', $mime);
Задача решена. 🙂
Поскольку я не могу комментировать причину репутации, мне придется ответить, даже если я не уверен на 100%, что это ваша проблема.
Дело в том, что иногда PHP-файлы могут доставлять массу хлопот.
<--- this little empty line
<?
code goes here
?>
<--- or this one
Помеченная пустая строка может уничтожить ваш заголовок. Вы проверили все свои файлы на наличие пустых строк, которые интерпретируются как содержимое вместо PHP-кода?
Включение предупреждений также может помочь в этом вопросе. Если есть какой-либо контент до установки заголовков, вы обычно получаете предупреждение, в котором говорится именно это.
У нас это было однажды в нашей компании, и это стоит 3 нашим разработчикам почти целый день, чтобы найти, потому что … причины.
РЕДАКТИРОВАТЬ: Видя ваш комментарий «Кодировка символов документа HTML не была объявлена». на самом деле подчеркивает мое заявление. Во всяком случае, не уверен на 100%.