Force Загрузить сгенерированный HTML-код

Я создаю плагин WordPress, который будет генерировать HTML-страницу при нажатии кнопки. Это работает; проблема не связана с WordPress, хотя код находится в плагине WP. Следующий шаг – дать пользователю приглашение загрузить / открыть созданный файл.

Основываясь на исследованиях здесь и в других местах, этот процесс должен создать приглашение для загрузки / открытия:

/* another process creates an HTML file "somefile.html", and stores it in the plugin folder; that is done with an fopen/fwrite/fclose. This process is started by a button on the plugin settings page. When the button is clicked, the "somefile.html" is created. So at this point, the HTML file is created and stored in the plugin folder */ $size = filesize($thefile); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='somefile.html'); header('Content-Transfer-Encoding: binary'); header('Connection: Keep-Alive'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . $size); exit; 

Процесс (запущенный кнопкой на странице настроек плагина) создает HTML-файл, и он правильно хранится в папке плагина (расположение файла не является проблемой и будет рассмотрено в окончательной версии). Затем я вижу диалог открытия / сохранения файла.

Если я открою сгенерированный HTML-файл с сервера, HTML будет как и ожидалось. Но если я открою сгенерированный файл с помощью приглашения open / save, я получу представление страницы настроек плагина, а не сгенерированного HTML.

Я подозреваю, что мне нужен obflush () / flush (), но размещение этих операторов перед строками заголовка не устраняет проблему.

Поэтому моя проблема заключается в том, что диалог open / save as не читает «somefile.html», который был сохранен на сервере. Я получаю HTML-страницу настроек плагинов с открытым диалогом.

Как я могу гарантировать, что создаваемый мной HTML-файл открывается через диалог открытия / сохранения?

(Обратите внимание, что хотя код находится внутри плагина WordPress, проблема не специфична для WordPress. Код просто создает кнопку формы; при отправке действия формы создается файл HTML и сохраняется на сервере. Операторы заголовка затем используется для создания диалога сохранения / открытия.)

ADDED

Этот код должен показывать этот процесс. Это «эффективная» HTML-страница, используемая для создания файла somefile.html.

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> <body> This is the page with some content. It will create the HTML page (the 'xoutput' content). </body> <!--- the above is the page that is initially displayed --> <?php // now we create the content of the generated/saved file $xoutput = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head> <body>'; $xoutput .= 'There is some content generated here. Actual content doesn't matter.'; $xoutput .= '</body> </html>'; $thefile = "outputfile.html"; $handle = fopen($thefile, "w"); fwrite($handle, $xoutput); fclose($handle); $quoted = sprintf('"%s"', addcslashes(basename($thefile), '"\\')); $size = filesize($thefile); // now that the somefile.html has been created and stored, let's create the open/save dialog header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . $quoted); header('Content-Transfer-Encoding: binary'); header('Connection: Keep-Alive'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . $size); exit; return; 

Когда вы загружаете страницу, вы получаете HTML-страницу «Существует некоторая информация, созданная здесь», а не контент «somefile.html».

Свежеиспеченные испытания и испытания:

 if (file_exists($thefile)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($thefile)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: '.filesize($thefile)); ob_clean(); flush(); readfile($thefile); exit; }