创建PHP并将其上载到FTP服务器而不保存本地

时间:2010-04-20 15:24:21

标签: php ftp

我在连接两个不同的进程时遇到问题。我的任务是从数据库中提取数据,从数据创建文件,然后将其上传到FTP服务器。

到目前为止,我使用此代码创建和下载文件,$out是一个包含完整文本文件的字符串:

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

当我想在浏览器中运行脚本并下载文件时,这是有效的,但我希望将其发送到FTP服务器。

我知道我与FTP服务器的连接工作正常,我正确导航到正确的目录,我从磁盘上取文件并使用ftp_put()将它们放在FTP上,但是我我正在寻找$out并将其直接写为文件,其中$filename作为其名称在FTP服务器上。我可能会误读事物,但当我尝试ftp_putftp_fput时,似乎他们想要文件位置,而不是文件流。我可以考虑不同的功能吗?

4 个答案:

答案 0 :(得分:17)

我在这里回答的不是评论,因为评论忽略了代码格式。

你可以尝试:


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

这将创建一个临时流而不实际将其写入磁盘。我不知道其他任何方式

答案 1 :(得分:6)

以上是来自上面的matei's解决方案作为完整函数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.');

答案 2 :(得分:3)

实际上ftp_put需要本地文件的路径(作为字符串),所以尝试将数据写入临时文件,然后ftp_put将其写入服务器


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

在这种情况下,您无需发送示例中发送的标头。

答案 3 :(得分:1)

最简单的解决方案是将file_put_contentsFTP URL wrapper一起使用:

file_put_contents('ftp://username:pa‌​ssword@hostname/path/to/file', $out);

如果它不起作用,可能是因为你没有URL wrappers enabled in PHP

如果您需要更好地控制写入(传输模式,被动模式,偏移,读取限制等),请使用带ftp_fput句柄的php://temp (or the php://memory) stream

$conn_id = ftp_connect('hostname');

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

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

(添加错误处理)

或者您可以直接在FTP服务器上打开/创建文件。如果文件很大,这一点特别有用,因为你不会将整个内容保存在内存中。

请参阅Generate CSV file on an external FTP server in PHP