2010-04-20 5 views
5

Ho riscontrato un problema nel collegare due diversi processi che ho funzionato. Sono stato incaricato di estrarre i dati da un database, creare un file dai dati e quindi caricarlo su un server FTP.Creazione e caricamento di un file in PHP su un server FTP senza salvataggio locale

Finora, ho il file da creare e scaricabile utilizzando questo codice, $out essendo una stringa che contiene il file di testo completo:

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); 
} 

Questo funziona quando voglio correre solo lo script in un browser e scarica il file, ma sto cercando di inviarlo a un server FTP.

So che la mia connessione al server FTP funziona correttamente, e sto navigando correttamente nella directory corretta, e ho preso i file dal disco e li ho messi sull'FTP usando ftp_put(), ma sto cercando prendere $out e scriverlo direttamente come file con $filename come nome sul server FTP. Potrei leggere male le cose, ma quando ho provato ftp_put e ftp_fput, sembrava che volessero le posizioni dei file, non i flussi di file. C'è una funzione diversa che potrei prendere in considerazione?

risposta

14

Ho risposto qui invece dei commenti poiché i commenti ignorano la formattazione del codice.

si potrebbe provare:

 

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

questo creerà un flusso temporanea senza in realtà la scrittura su disco. Non conosco nessun altro modo

+0

Questo è quello che sto cercando, grazie. –

3

In realtà si aspetta ftp_put il percorso del file locale (come una stringa), quindi cercate di scrivere i dati in un file temporaneo e poi ftp_put al 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 questo caso non lo fai è necessario inviare le intestazioni che hai inviato nel tuo esempio.

+1

C'è un modo per farlo senza creare un file sul file system? –

4

Ecco matei's soluzione dall'alto ftp_file_put_contents funzione come complete():

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

La soluzione più semplice sta usando file_put_contents con FTP URL wrapper:

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

Se non funziona, probabilmente perché non hai URL wrappers enabled in PHP.


Se avete bisogno di un maggiore controllo sulla scrittura (modalità di trasferimento, la modalità passiva, offset, limite di lettura, ecc), utilizzare il ftp_fput con una maniglia per il 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); 

(aggiungi gestione degli errori)

Problemi correlati