如何流式传输从 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 获取的文件而不将其存储在本地?的主要内容,如果未能解决你的问题,请参考以下文章