Скачать файл с JSF? [Дубликат]

Это сообщение об ошибке запускается, когда отправляется сообщение перед отправкой заголовков 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, код до и т. д.
  • Предупреждение, выданное php, если установлено свойство display_errors php.ini. Вместо того, чтобы сбой при ошибке программиста, php молча фиксирует ошибку и выдает предупреждение. Хотя вы можете изменить конфигурации display_errors или error_reporting , вы должны скорее исправить эту проблему. Основными причинами являются доступ к неопределенным элементам массива (например, $_POST['input'] без использования empty или isset , чтобы проверить, установлен ли вход) или используя неопределенная константа вместо строкового литерала (как в $_POST[input], обратите внимание на недостающие кавычки).
  • Включение буферизации вывода должно устранить проблему; все выходные данные после вызова ob_start буферизуются в памяти до тех пор, пока вы не отпустите буфер, например. с ob_end_flush .

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

    15
    задан ErVeY 6 August 2010 в 21:46
    поделиться

    1 ответ

    Если это простой файл, просто поместите его в общедоступный веб-контент (туда, куда вы помещаете свои статические файлы и файлы 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 не взял навигацию в свои руки. Такой же код сервлета можно повторно использовать для потоковой передачи файла. Вы можете найти начальный пример в этот ответ .

    24
    ответ дан 1 December 2019 в 01:23
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: