2017-02-15 2 views
0

Ich versuche, eine Datei mit SlimPHP herunterzuladen, und es scheint nicht für mich zu arbeiten.SlimPHP Anwendung wird nicht heruntergeladen Datei

Hier ist die Route, die ich gemacht habe:

$backendApp->post('/export', function ($request, $response, $args) { 
     $emails = $this->orginization->exportEmails(); 
     $exportFile = $this->file->writeEmailExport($emails, 'AllEmails.csv'); 

     $fh = fopen($exportFile, "r"); 
     $stream = new \Slim\Http\Stream($fh); 

     $response = $response->withHeader('Content-Type', 'application/octet-stream') 
      ->withHeader('Content-Description', 'File Transfer') 
      ->withHeader('Content-Disposition', 'attachment; filename="' . basename($exportFile) . '"') 
      ->withHeader('Content-Length', filesize($exportFile)) 
      ->withBody($stream); 

     return $response; 
    }); 

ich für eine Tatsache wissen, dass $ Exportdatei eine gültige PHP-Streaming-Ressource ist als der Inhalt der Datei in der Antwort zurückkommen, ich brauche nur zu triggern die Download-Funktion für Browser-Dateien für den Benutzer.

Dies sind die Header, die auf der Reaktion vorhanden sind:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Connection:close 
Content-Description:File Transfer 
Content-Disposition:attachment; filename="AllEmails.csv" 
Content-Length:267 
Content-Type:application/octet-stream 
Expires:Thu, 19 Nov 1981 08:52:00 GMT 
Host:localhost:8080 
Pragma:no-cache 
X-Powered-By:PHP/5.6.15 

Hat Herausragenden alles sofort, dass ich hier falsch mache? Ich kann den Inhalt der Datei auf der Registerkarte "Antwort" sehen, damit ich weiß, dass ich den Inhalt der Datei erhalte. Ich muss nur den Benutzer dazu auffordern, diese Datei herunterzuladen.

+0

Mein Download-Datei-Code verwendet nicht das schlanke Framework und mein Code ist 3+ Jahre alt, also sollte ich vielleicht nicht kommentieren, aber ich habe mich nur gefragt - haben Sie versucht mit 'preg_replace (" ([^ \ w \ s \ d \ -_ ~,;: \ [\] \ (\].] | [\.] {2,}) ", '', $ exportFile)' und 'filter_var ($ dl_file, FILTER_SANITIZE_URL)' where ' $ dl_file' ist das Ergebnis von preg_replace, um ungültige Zeichen zu entfernen? Wenn Sie den Inhalt der Datei bekommen .... Ich bin mir nicht ganz sicher, ob das helfen würde, nur ein Gedanke. – Inkdot

Antwort

1

Es ist im Zusammenhang mit aber Sie dies fordern, wie dieser Code funktioniert:

$app = new \Slim\App($config); 

$app->get("/", function ($request, $response, $args) { 

    $response->write(
     <<<EOT 
<form method="POST" action="/export"> 
<input type="submit" value="Download"> 
</form> 
EOT 
    ); 

    return $response; 
}); 

$app->post('/export', function ($request, $response, $args) { 
    $exportFile = __DIR__ . '/../test_file.txt'; 

    $fh = fopen($exportFile, "r"); 
    $stream = new \Slim\Http\Stream($fh); 

    $response = $response->withHeader('Content-Type', 'application/octet-stream') 
     ->withHeader('Content-Description', 'File Transfer') 
     ->withHeader('Content-Disposition', 'attachment; filename="' . basename($exportFile) . '"') 
     ->withHeader('Content-Length', filesize($exportFile)) 
     ->withBody($stream); 

    return $response; 
}); 

Sie sagen, dass Sie die Informationen in der Antwort Registerkarte sehen können. Bedeutet dies, dass Sie dies über JavaScript auslösen? Wenn dies der Fall ist, sendet der Browser die Datei zurück an den JS und nicht an den Benutzer. Wenn Sie möchten, dass das Dialogfeld zum Herunterladen von Dateien angezeigt wird, geben Sie ein Formular (wie Sie einen POST wünschen) mit einer Schaltfläche an, auf die der Benutzer klicken kann.

+0

Ahhh ja Ihr Kommentar zum Aufruf der Route via Javascript war genau richtig. Danke – Xenology

Verwandte Themen