2010-04-20 15 views
5

Çalıştığım iki farklı işlemi birbirine bağlamakta sorun yaşıyorum. Veritabanından veri çekerek, verilerden bir dosya oluşturup daha sonra bir FTP sunucusuna yükleyerek görevlendirildim. Sadece bir tarayıcıda komut dosyasını çalıştırmak istediğinizdeYerel olarak kaydedilmeden bir FTP sunucusuna PHP'de bir dosya oluşturma ve karşıya yükleme

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

Bu çalışır:

Şimdiye kadar, tam metin dosyasını içeren bir dize olmak $out bu kodu kullanarak oluşturulan dosya ve indirilebilir var ve dosyayı indirin, ancak bunun yerine bir FTP sunucusuna göndermek istiyorum.

FTP sunucusuna olan bağlantımın gayet iyi çalıştığını biliyorum ve doğru dizine doğru bir şekilde gidiyorum. Dosyaları diskten aldım ve ftp_put()'u kullanarak FTP'ye koyuyorum. $out'u almak ve doğrudan FTP sunucusundaki adı olarak $filename ile bir dosya olarak yazmak. Bir şeyleri yanlış yorumluyor olabilirim, ancak ftp_put ve ftp_fput'u denediğimde, dosya akışları değil, dosya konumları istiyorlardı. Düşünebildiğim farklı bir işlev var mı?

cevap

14

Yorumlar, kod biçimlendirmesini yok saydığı için yorumların yerine burada yanıt verdim.

deneyebilirsin:

 

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

bu aslında diske yazmadan geçici akışı yaratacaktır. Başka bir yol

+0

Aradığım şey bu, teşekkürler. –

3

Aslında ftp_put (bir karakter dizisi) yerel dosyaya yolu, görmemeni Bu durumda sunucunun

 

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

için kendisine ftp_put sonra ve geçici bir dosyada veri yazmayı deneyin bekliyor Örneğinizde gönderdiğiniz başlıkları göndermeniz gerekir.

+1

Dosya sisteminde dosya yapmadan bunu yapmanın bir yolu var mı? –

4

İşte tamamlandı olarak işlev ftp_file_put_contents() yukarıdan matei's çözümdür bilmiyorum:

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

kolay çözüm kullanıyor file_put_contentsFTP URL wrapper ile:

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

bunun ise çalışmıyor, muhtemelen URL wrappers enabled in PHP yok çünkü. Yazmakta üzerinde daha fazla kontrol (transfer modu, pasif mod, ofset, okuma limiti, vs) ihtiyaç


, php://temp (or the php://memory) stream bir kulplu ftp_fput kullanın:

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

(ekleme hata işleme)

İlgili konular