Это сообщение об ошибке запускается, когда отправляется сообщение перед отправкой заголовков HTTP (с помощью setcookie
или header
). Общие причины вывода чего-либо перед заголовками HTTP:
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Чтобы избежать этого, просто оставьте закрытие ?>
- это не обязательно. g2] в начале файла php. Изучите ваши php-файлы с помощью шестнадцатеричного редактора, чтобы узнать, так ли это. Они должны начинаться с байтов 3F 3C
. Вы можете безопасно удалить спецификацию EF BB BF
с начала файлов.
echo
, printf
, readfile
, passthru
, код до
и т. д. display_errors
php.ini. Вместо того, чтобы сбой при ошибке программиста, php молча фиксирует ошибку и выдает предупреждение. Хотя вы можете изменить конфигурации display_errors
или error_reporting , вы должны скорее исправить эту проблему. Основными причинами являются доступ к неопределенным элементам массива (например, $_POST['input']
без использования empty
или isset
, чтобы проверить, установлен ли вход) или используя неопределенная константа вместо строкового литерала (как в $_POST[input]
, обратите внимание на недостающие кавычки). Включение буферизации вывода должно устранить проблему; все выходные данные после вызова ob_start
буферизуются в памяти до тех пор, пока вы не отпустите буфер, например. с ob_end_flush
.
Однако, хотя буферизация вывода исключает проблемы, вы должны действительно определить, почему ваше приложение выводит тело HTTP перед заголовком HTTP. Это будет похоже на телефонный звонок и обсуждение вашего дня и погоды, прежде чем сообщить вызывающему, что у него неправильный номер.
Если это простой файл, просто поместите его в общедоступный веб-контент (туда, куда вы помещаете свои статические файлы и файлы JSF) и создайте ссылку.
<h:outputLink value="/files/file.ext">link</h:outputLink>
Контейнер сервлетов позаботится о применении правильных заголовков.
Если он расположен за пределами общедоступного веб-контента по каким-то конкретным причинам (например, по фиксированному пути на сервере или в базе данных), то создайте сервлет, который получает его InputStream
и записывает его в OutputStream
ответа по крайней мере вместе с заголовками Content-Type
, Content-Disposition
и Content-Length
. Вы можете найти здесь простой пример начала. Также это можно просто связать с URL-шаблоном сервлета
.
Если он должен генерироваться динамически и в зависимости от конкретных параметров запроса JSF, вы также можете сделать это в действии управляемого bean-компонента, связанного с h: commandLink
или h: commandButton
, но вам нужно только убедиться, что вы вызываете FacesContext # responseComplete ()
в конце метода действия bean-компонента, чтобы JSF не взял навигацию в свои руки. Такой же код сервлета можно повторно использовать для потоковой передачи файла. Вы можете найти начальный пример в этот ответ .