在不使用中间文件的情况下将内存中的数据传输到 FTP 服务器


Transfer in-memory data to FTP server without using intermediate file

我有一些用PHP的json_encode()编码的JSON数据,它看起来像这样:

{
    "site": "site1",
    "nbrSicEnt": 85,
}

我想做的是将数据作为文件直接写入FTP服务器。

出于安全原因,我不希望在将文件发送到FTP服务器之前先在本地创建文件,我希望动态创建它。因此,例如不使用tmpfile()

当我阅读 php 文档时 ftp_put

bool ftp_put ( resource $ftp_stream , string $remote_file , 
               string $local_file , int $mode [, int $startpos = 0 ] )

在将本地文件写入远程文件之前,需要创建一个本地文件(string $local_file)。

我正在寻找一种直接写入remote_file的方法。如何使用 PHP 来做到这一点?

file_put_contents是最简单的解决方案:

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

如果它不起作用,可能是因为您没有在 PHP 中启用 URL 包装器。


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

$conn_id = ftp_connect('hostname');
ftp_login($conn_id, 'username', 'password');
ftp_pasv($conn_id, true);
$h = fopen('php://temp', 'r+');
fwrite($h, $contents);
rewind($h);
ftp_fput($conn_id, '/path/to/file', $h, FTP_BINARY, 0);
fclose($h);
ftp_close($conn_id);

(添加错误处理)


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

请参阅在 PHP 中的外部 FTP 服务器上生成 CSV 文件。

根据您可以使用 ftp_put() 或类似的东西将行附加到远程文件吗? 和 使用 PHP 流式传输 FTP 上传? 您应该能够使用 CURL 或 PHP 的 FTP 包装器做一些事情 file_put_contents() .

$data = json_encode($object);
file_put_contents("ftp://user:pass@host/dir/file.ext", $data, FILE_APPEND);