2010-04-20 21 views
5

Tengo un problema al conectar dos procesos diferentes que tengo trabajando. Me han encargado extraer los datos de una base de datos, crear un archivo a partir de los datos y luego subirlos a un servidor FTP.Creando y cargando un archivo en PHP a un servidor FTP sin guardar localmente

Hasta el momento, no tengo el archivo que se está creando y descargable utilizando este código, $out ser una cadena que contiene el archivo de texto 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); 
} 

Esto funciona cuando quiero simplemente ejecutar la secuencia de comandos en un navegador y descargue el archivo, pero estoy buscando enviarlo a un servidor FTP.

Sé que mi conexión al servidor FTP funciona correctamente y estoy navegando correctamente en el directorio correcto, y tomé los archivos del disco y los puse en el FTP usando ftp_put(), pero estoy buscando para tomar $out y escribirlo directamente como un archivo con $filename como su nombre en el servidor FTP. Puede que esté malinterpretando cosas, pero cuando probé ftp_put y ftp_fput, parecía que querían ubicaciones de archivos, no de archivos. ¿Hay alguna función diferente que pueda considerar?

Respuesta

14

He respondido aquí en lugar de los comentarios ya que los comentarios ignoran el formato del código.

usted podría intentar:

 

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

Esto creará una corriente temporal sin escribir en el disco. No sé de ninguna otra manera

+0

Eso es lo que estoy buscando, gracias. –

3

En realidad ftp_put espera que la ruta de acceso al archivo local (como una cadena), a fin de tratar de escribir los datos en un archivo temporal y luego ftp_put al servidor

 

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

En este caso no lo hace necesita enviar los encabezados que estaba enviando en su ejemplo.

+1

¿Hay alguna manera de hacer esto sin hacer un archivo en el sistema de archivos? –

4

Aquí es matei's solución desde arriba ftp_file_put_contents funcionan como completos():

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 solución más fácil es usar file_put_contents con FTP URL wrapper:

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

Si no funciona, es probable que sea porque no tiene URL wrappers enabled in PHP.


Si necesita un mayor control sobre la escritura (modo de transferencia, el modo pasivo, offset, límite de lectura, etc.), utilice el ftp_fput con un identificador para el 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); 

(añadir manejo de errores)

Cuestiones relacionadas