【问题标题】:Download FTP file to client w/ Readfile()使用 Readfile() 将 FTP 文件下载到客户端
【发布时间】:2016-11-04 10:19:20
【问题描述】:

我正在为我们的客户构建一个基于 web 的文件管理界面,我试图在不先下载到本地 web 服务器的情况下促进从远程 (FTP) 服务器到客户端的下载。

我发现Readfile() 完全可以满足需要,无论是基于 Web 的下载还是来自公共 FTP 服务器的下载都可以完美运行。问题是,当通过 FTP url 指定凭据时,它显然不再有效。我在网上找到了其他关于此的报告,但到目前为止还没有解决方案或变通方法。

$file_url = 'ftp://username:password@198.2.148.130/198.2.148.130%20port%2025665/server.properties';
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
readfile($file_url);

是否有任何解决方法可以使其按预期运行?我对如何解决这个问题感到困惑,这似乎是一个错误而不是限制。

【问题讨论】:

  • 实际上,您使用上面显示的方法首先将文件下载到服务器,然后将其中继到客户端。
  • 关于您的具体问题:查看 php 的 ftp 扩展名并使用临时文件。
  • 我很抱歉,我应该更清楚。我使用的方法不会导致客户端必须等待下载完成才能开始下载。它只是将其存储在服务器的内存中,而不是将其写入文件。
  • @arkascha 我不认为你在回答这个问题。我很确定 OP 知道该文件没有直接下载到客户端。
  • @BrettPowell “不再有效” 是什么意思?它有什么作用?你得到什么错误(如果有的话)? - 你的代码对我有用!

标签: php download ftp readfile


【解决方案1】:

URL 中的 URL 编码空格 (%20) 似乎是罪魁祸首。

只需使用文字空格:

$file_url = 'ftp://username:password@198.2.148.130/198.2.148.130 port 25665/server.properties';

在 PHP FTP URL 包装器中以这种方式指定凭据是完全有效的。

【讨论】:

  • 奇怪的是,我可以发誓我已经尝试过两次,但实际上它现在正在工作。我想在 cmets 中说过之后我应该再试一次,但谢谢!
  • 根据您对答案的更新,php ftp url 包装器中是否有类似的替代方法可以在客户端上启动自动下载?这是我发现的所有其他方法的主要关注点,需要在客户端下载开始之前将其下载到 Web 服务器。
  • 这个问题太复杂了,无法在评论中回答。但是不,您不能从您的 Web 服务器启动从 FTP 服务器到客户端的直接传输。您所能做的就是直接在网页上使用ftp:// URL。但随后您将不得不向用户透露凭据。
  • 这就是我的想法,但对最后的措辞有点困惑。再次感谢您帮助我解决这个问题,Readfile 非常完美,我担心这是一个错误/限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多