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

问题描述 投票:2回答:3

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

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

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

php ftp
3个回答
2
投票

为FTP添加卷曲支持:

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

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

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


3
投票

你用file_put_contents旗试过FILE_APPEND吗?


2
投票

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

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

(添加错误处理)


如果您没有匹配的本地文件,即您正在从内存中上传一大块内容,并且您需要更好地控制写入(传输模式,被动模式等),而不是使用file_put_contents,请使用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, $chunk);
rewind($h);

// prevent ftp_fput from seeking local "file" ($h)
ftp_set_option($conn_id, FTP_AUTOSEEK, false);

$remote_path = '/path/to/file';
$size = ftp_size($conn_id, $remote_path);
$r = ftp_fput($conn_id, $remote_path, $h, FTP_BINARY, $size);

fclose($h);
ftp_close($conn_id);

(再次,添加错误处理)

© www.soinside.com 2019 - 2024. All rights reserved.