Я создаю плагин 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 (), но размещение этих операторов перед строками заголовка не решает проблему.
Поэтому моя проблема заключается в том, что диалог открытия / сохранения как не читает «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;
}
Других решений пока нет …