Ich erstelle ein WordPress-Plugin, das HTML-Seite erzeugt, wenn eine Taste gedrückt wird. Das funktioniert; Das Problem ist nicht WordPress-bezogen, obwohl der Code in einem WP-Plugin ist. Der nächste Schritt besteht darin, dem Benutzer eine Aufforderung zum Herunterladen/Öffnen der erstellten Datei zu geben.Erzwingen Download von generiertem HTML
Basierend auf der Forschung hier und anderswo, sollte dieser Prozess einen Download/open Prompt erstellen:
/* 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;
Der Prozess (durch den Button klicken Sie auf der Plugin-Einstellungen Seite gestartet), um die HTML-Datei wird erstellen, und es wird im Plugin-Ordner korrekt gespeichert (der Speicherort der Datei ist kein Problem und wird in der endgültigen Version behoben). Dann sehe ich den Öffnen/Speichern-Dialog.
Wenn ich die generierte HTML-Datei vom Server öffnen, ist das HTML wie erwartet. Aber wenn ich die generierte Datei über die open/save-Eingabeaufforderung öffne, bekomme ich eine Darstellung der Plugin-Einstellungsseite, nicht das generierte HTML.
Ich vermute, dass ich ein obflush()/flush() brauche, aber das Setzen dieser Anweisungen vor den Kopfzeilen behebt das Problem nicht.
Also mein Problem ist, dass der Öffnen/Speichern als Dialog nicht die 'somefile.html', die auf dem Server gespeichert wurde lesen. Ich erhalte eine Plugins-Einstellungs-HTML-Seite mit dem geöffneten Dialog.
Wie stelle ich sicher, dass die HTML-Datei, die ich erstellt habe, über den Öffnen/Speichern-Dialog geöffnet wird?
(Beachten Sie, dass, obwohl der Code in einem WordPress-Plugin ist, das Problem nicht spezifisch für WordPress ist. Der Code erstellt nur eine Formularschaltfläche; beim Senden erstellt die Formularaktion eine HTML-Datei und speichert sie auf dem Server. header‘Aussagen werden dann eine
speichern/öffnen-Dialog.) sollte den Prozess zeigenADDED
Dieser Code zu erstellen. Dies ist die "effektive" HTML-Seite, die zum Erstellen der Datei sablefile.html verwendet wird.
<!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;
Wenn Sie die Seite laden, erhalten Sie die HTML-Seite, nicht die ‚somefile.html‘ Inhalt ‚Es gibt einige Inhalt hier erzeugt wird‘.
Können Sie erreichen somefile.html via Browser? – deg
Ich kann sehen, dass die somefile.html auf dem Server die Datei ist, die ich generiert habe (über meinen Code-Editor). Das Problem ist die Datei, die mit dem geöffneten Dialogfeld angezeigt wird, ist die Plugin-Seite, nicht die generierte Datei. –
Nein, ich meine mit Ihrem Browser, können Sie somefile.html über URL öffnen? Ich versuche mich von CMS fernzuhalten, aber ich erinnere mich, dass manchmal der Zugriff auf interne Ordner durch htaccess-Dateien eingeschränkt ist. – deg