2017-09-03 4 views
0

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 zeigen

ADDED

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‘.

+0

Können Sie erreichen somefile.html via Browser? – deg

+0

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. –

+0

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

Antwort

1

Frisch Bewährtes:

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; 
} 
+0

Ja, das wird es tun. Danke für die zusätzliche Zeit! –

+0

Obwohl der obige Code funktioniert (danke, @deg), ist ein Fehler aufgetaucht: siehe https: // stackoverflow.com/questions/47106803/header-output-doesnt-show-öffnen-speichern-dialog-on-one-site. –

Verwandte Themen