2010-04-20 4 views
5

Ich habe ein Problem beim Verbinden von zwei verschiedenen Prozessen, die ich arbeite. Ich habe die Aufgabe, Daten aus einer Datenbank zu ziehen, eine Datei aus den Daten zu erstellen und sie dann auf einen FTP-Server hochzuladen.Erstellen und Hochladen einer Datei in PHP auf einen FTP-Server ohne lokal zu speichern

Bisher habe ich die Datei erstellt und zum Download wird mit diesem Code, $out ein String ist, der die vollständige Textdatei enthält:

if ($output == 'file') 
{ 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Content-Length: ".strlen($out)); 
    header("Content-type: application/txt"); 
    header("Content-Disposition: attachment; filename=".$file_name); 
    echo($out); 
} 

Dies funktioniert, wenn ich will nur das Skript in einem Browser laufen und lade die Datei herunter, aber ich möchte sie stattdessen an einen FTP-Server senden.

Ich weiß meine Verbindung mit dem FTP-Server funktioniert einwandfrei, und ich bin korrekt zum richtigen Verzeichnis navigieren, und ich habe Dateien von der Festplatte und legte sie auf dem FTP mit ftp_put(), aber ich bin auf der Suche Nehmen Sie $out und schreiben Sie es direkt als Datei mit $filename als Name auf dem FTP-Server. Ich kann Dinge falsch interpretieren, aber als ich versuchte ftp_put und ftp_fput, schien es, dass sie Dateispeicherorte, nicht Dateiströme wollen. Gibt es eine andere Funktion, die ich berücksichtigen könnte?

Antwort

14

Ich habe hier statt der Kommentare beantwortet, da Kommentare Codeformatierung ignorieren.

Sie könnten versuchen:

 

$fp = fopen('php://temp', 'r+'); 
fwrite($fp, $out); 
rewind($fp);  
ftp_fput($ftp_conn, $remote_file_name, $fp, FTP_ASCII); 
 

dies einen temporären Strom auf der Festplatte zu schreiben, ohne tatsächlich schaffen wird. Ich kenne keine andere Art und Weise

+0

Das ist, was ich suche, danke. –

3

Eigentlich erwartet ftp_put der Pfad zur lokalen Datei (als String), so versuchen, die Daten in einer temporären Datei zu schreiben und ftp_put es dann an den Server

 

file_put_contents('/tmp/filecontent'.session_id(), $out); 
ftp_put($ftp_conn, $remote_file_name, '/tmp/filecontent'.session_id()); 
unlink('/tmp/filecontent'.session_id()); 
 

In diesem Fall, dass Sie nicht tun Sie müssen die Header senden, die Sie in Ihrem Beispiel gesendet haben.

+1

Gibt es eine Möglichkeit, dies zu tun, ohne eine Datei im Dateisystem zu erstellen? –

4

Hier matei's Lösung von oben als kompletter Funktion ftp_file_put_contents():

function ftp_file_put_contents($remote_file, $file_string) { 

// FTP login details 
$ftp_server='my-ftp-server.de'; 
$ftp_user_name='my-username'; 
$ftp_user_pass='my-password'; 

// Create temporary file 
$local_file=fopen('php://temp', 'r+'); 
fwrite($local_file, $file_string); 
rewind($local_file);  

// FTP connection 
$ftp_conn=ftp_connect($ftp_server); 

// FTP login 
@$login_result=ftp_login($ftp_conn, $ftp_user_name, $ftp_user_pass); 

// FTP upload 
if($login_result) $upload_result=ftp_fput($ftp_conn, $remote_file, $local_file, FTP_ASCII); 

// Error handling 
if(!$login_result or !$upload_result) 
{ 
    echo('<p>FTP error: The file could not be written to the FTP server.</p>'); 
} 

// Close FTP connection 
ftp_close($ftp_conn); 

// Close file handle 
fclose($local_file); } 


// Function call 
ftp_file_put_contents('my-file.txt', 'This text will be written to your text file via FTP.'); 
0

Die einfachste Lösung ist mit file_put_contents mit FTP URL wrapper:

file_put_contents('ftp://username:pa‌​[email protected]/path/to/file', $out); 

Wenn es funktioniert nicht, es ist wahrscheinlich, weil Sie URL wrappers enabled in PHP nicht haben.


Wenn Sie mehr Kontrolle über das Schreiben müssen (Transfermodus, passiven Modus, Offset, Lesen Grenze usw.), verwenden Sie die ftp_fput mit einem Griff zum php://temp (or the php://memory) stream:

$conn_id = ftp_connect('hostname'); 

ftp_login($conn_id, 'username', 'password'); 

$h = fopen('php://temp', 'r+'); 
fwrite($h, $out); 
rewind($h); 

ftp_fput($conn_id, '/path/to/file', $h, FTP_BINARY, 0); 

fclose($h); 
ftp_close($conn_id); 

(hinzufügen Fehlerbehandlung)

Verwandte Themen