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

Posted

技术标签:

【中文标题】如何流式传输从 FTP 获取的文件而不将其存储在本地?【英文标题】:How to stream a file I get from an FTP without storing it locally? 【发布时间】:2015-02-10 13:45:47 【问题描述】:

我需要向我的门户网站最终用户提供一个存储在 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 的文件而不是将其存储在 Web 服务器的硬盘上。

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

我找到了 readfile() 函数,但它以文件名作为参数,而不是像 ftp_fget() 这样的资源需要... 是否有其他与 fget_fget 兼容的函数或其他方法

【问题讨论】:

【参考方案1】:

您的问题由两部分组成:

    将 FTP 文件作为流读取(参见fread() 的示例:“PHP: How do I read a .txt file from FTP server into a variable?”)

    Streaming a Response in Symfony2

【讨论】:

以上是关于如何流式传输从 FTP 获取的文件而不将其存储在本地?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 裁剪图像而不将其加载到内存中

如何播放音频样本而不将其写入文件?

Spring WebClient:如何将大字节 [] 流式传输到文件?

捕获图像而不将其存储到内部/外部存储

如何直接在云端上传图片而不将其存储到本地目录中?

直接将文件上传到SFTP而不将其存储到本地系统[重复]