你可以使用ftp_put()或类似的东西将行附加到远程文件吗?

时间:2011-08-29 19:22:57

标签: php ftp

这是情况......我有两台服务器,服务器1和服务器2。 服务器1从服务器2下载csv文件,从服务器2中删除它,从中读取行并进行一些处理。

在处理时,可以重新创建或更改服务器2上的文件,添加更多行。 完成处理后,服务器1需要将文件上传回服务器2。

然而,ftp_put()将完全覆盖服务器2上的文件。我真正想做的是附加到服务器2上的文件而不是覆盖它。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:3)

您是否使用file_put_contents标志尝试了FILE_APPEND

答案 1 :(得分:2)

为FTP添加Curl支持:

curl_setopt($ch, CURLOPT_FTPAPPEND, TRUE ); // APPEND FLAG

这可能就是你要找的东西。你熟悉卷曲吗?

另一个选项是使用ftp:// / ftps://个流,因为PHP 5允许附加。见ftp://; ftps:// Docs。可能更容易访问。

答案 2 :(得分:2)

如其他答案所示,带有FILE_APPEND标志的file_put_contents是将块添加到远程文件末尾的最简单的解决方案:

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

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

但是,如果您确实拥有匹配的文件本地副本,只需添加新内容,就可以更轻松地使用ftp_put的“隐藏”功能FTP_AUTORESUME

$conn_id = ftp_connect('hostname');

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

$remote_path = '/path/to/file';
$local_path = 'file';
ftp_put($conn_id, $remote_path, $local_file, FTP_BINARY, FTP_AUTORESUME);

ftp_close($conn_id);

(添加错误处理)

如果您没有匹配的本地文件,即您正在从内存中上传一大块内容,并且您需要更好地控制写入(传输模式,被动模式等),而不是使用{{ 1}},使用带ftp_fput的句柄的php://temp (or the php://memory) stream

file_put_contents

(同样,添加错误处理)