2017-03-23 2 views
2

Ich habe eine Website mit PHP erstellt und ich muss eine Datei vom FTP-Server herunterladen.Datei-Download von FTP zu PHP: // Ausgabe funktioniert nicht

Ich möchte nicht vorübergehend die Datei auf dem Webserver speichern, also speichere ich es im PHP-Puffer. Aber wenn ich es herunterlade, ist der Puffer anscheinend leer, weil der Dateiname übereinstimmt, aber die Datei leer ist.

Hier ist mein Code

ob_start(); 
ftp_chdir($conn_id, $_REQUEST["path"]); 
ftp_get($conn_id, "php://output", $_REQUEST["remoteFile"], FTP_BINARY); 
$data = ob_get_contents(); 
header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='. $_REQUEST["remoteFile"]); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . strlen($data)); 
echo $data; 
ob_end_clean(); 
exit; 

Zum Beispiel, wenn ich versuche, eine txt-Datei herunterladen, die zuvor zu Recht hochgeladen, der Dateiname ist ok, aber Inhalt ist leer.

+0

Was gibt das 'ftp_get' zurück? Verursacht die 'ftp_get' (oder irgendeine andere' ftp_'Funktion) irgendeine PHP Warnung/Fehler zurück? Können Sie die Datei trotzdem auf demselben Rechner herunterladen (z. B. über die Befehlszeile 'ftp')? Geben Sie uns Informationen, mit denen wir Ihr Problem beheben können. Du hast uns nichts erzählt, außer * "es funktioniert nicht" *. Wir brauchen [mcve]. - Wenn Sie Probleme haben, versuchen Sie zunächst einen einfachen Download in eine Datei, bevor Sie mit der Pufferung der Ausgabe beginnen! –

+0

das ftp_get gibt true zurück und das PHP gibt keine Warnung oder Fehler zurück – arstek

Antwort

1

An der Stelle, an der Sie die echo $data; aufrufen, ist die Ausgangspufferung immer noch eingeschaltet. Sie schreiben also die Daten (zweites Mal) in den Ausgabepuffer zurück. Und dann löschst du es. Es wird also nichts ausgegeben.

zurückkehren einfach die echo $data; und ob_end_clean(); Anrufe:

ob_end_clean(); 
echo $data; 

Obwohl eine Art und Weise einfacher ist, wie etwas zu tun:

$data = file_get_contents("ftp://username:[email protected]/path/file.dat"); 
header(...); 
echo $data; 

ftp:// protocol wrappers aktiviert Unter der Annahme.

Und Sie brauchen keine Pufferung. Und Sie werden die Datei auch nicht zweimal im Speicher haben.

Verwandte Themen