如何流式传输从 FTP 获取的文件而不将其存储在本地?

How to stream a file I get from an FTP without storing it locally?

我需要向我的门户网站最终用户提供存储在 FTP 服务器上的文件。

我创建了一个本地临时文件,我将 FTP 的文件下载到我的临时文件中,完成后我将它与 Symfony 的文件一起发送 HTTP 响应:

$tempPath = tempnam(sys_get_temp_dir(), 'ftp');

$tempFile = fopen($tempPath, 'a+');

$log = "myLog";
$pass = "myPwd";

$conn_id = ftp_connect('my.ftp.server');
$ftp_login = ftp_login($conn_id, $log, $pass);

ftp_fget($conn_id, $tempFile, $path, FTP_ASCII, 0);
ftp_close($conn_id);

fclose($tempFile);

return $app->sendFile($tempPath, 200, array('Content-Type' => 'application/force-download', 'Content-disposition' => "attachment; filename=myFile.zip"));

它有效,但我会做得更好(确保删除临时文件,提高性能,...)

我看到 Symfony 提供了 HTTP 流式响应助手,所以我想发送 FTP 的文件而不将其存储在网络服务器的硬盘上。

为了得到它,我想我需要将 ftp_fget() 函数(或其他 FTP 函数)连接到可以将其输出到 php://output 或标准的 PHP 函数输出(我真的不知道这个 PHP 范围)。

我找到了 readfile() 函数,但它以文件名作为参数,而不是 ftp_fget() 需要的资源... 是否有其他函数与 [=30= 兼容] 或其他方式?

您的问题由两部分组成:

  1. 正在以流的形式读取 FTP 文件(参见 fread() 的示例:“PHP: How do I read a .txt file from FTP server into a variable?”)

  2. Streaming a Response in Symfony2