【问题标题】:PHP - Download from URL and Upload via FTPPHP - 从 URL 下载并通过 FTP 上传
【发布时间】:2011-06-16 08:43:52
【问题描述】:

这里有点奇怪的概念...我们的一个客户希望通过 FTP/S 将数据推送给他们

我们的想法是,我们通过从 URL(CSV 文件)下载来下载我们的一份报告,然后通过 FTP/S 将其推送到客户端。我知道我可以使用 wget 和 ftp 在 bash 脚本中执行此操作 - 但需要通过 Web 界面添加,因此 PHP 是最好的前进方式。

由于这是一项后台任务,我可以延长超时等。

我也知道我可以使用 fopen 下载和保存文件,然后找到它并使用 PHP FTP 库上传。只是在寻找一种使用fopen下载的方法,将数据保存在内存中以立即上传。

提前感谢任何帮助!

【问题讨论】:

  • 使用现有工具而不是自己编写。你也可以从 PHP 中调用它们。
  • 我不认为你可以直接从内存中直接上传文件。您应该将其保存到本地文件夹,然后在成功上传后;删除它。
  • @Arda,你想错了,但你的第二个陈述当然是一个有效的观点,但它并不总是适用。
  • @hakre,这在某些情况下就足够了,但我的经验表明,在很多情况下情况正好相反。
  • @Peter:我认为包装器算作现有工具:)

标签: php ftp fopen ftps


【解决方案1】:

要从 URL 中检索数据,您有几个选项。你说你只希望内存中的数据直接推送到 FTP 主机。

file_get_contents()

是一种方法(我发现使用最简单,但缺乏可靠性和错误处理)

例子:

$url = 'http://www.domain.com/csvfile';
$data = file_get_contents($url);

现在您的 csv 数据位于 $data 中,接下来介绍如何将其推送到 ftp 服务器。

同样,最简单的方法是使用上面 get 示例中使用的内置流包装器。 (但请注意,这需要 PHP 4.3.0)

像这样简单地建立连接字符串。

$protocol = 'ftps';
$hostname = 'ftp.domain.com';
$username = 'user';
$password = 'password';
$directory = '/pub';
$filename = 'filename.csv';
$connectionString = sprintf("%s://%s:%s@%s%s/%s",
    $protocol,$username,$hostname,
    $password,$directory,
    $filename);


file_put_contents($connectionString,$data);

看看ftp wrappers manual

如果这不起作用,还有其他选择。

您可以使用curl 获取数据并使用FTP Extension 推送它。

【讨论】:

  • 为此干杯 - 我很想更多地考虑下载这个,然后重新上传,以便我可以在上传前后对文件运行一些 md5 检查以检查完整性 - 但是我是将尝试使用此代码实现它:)
  • 您也可以在内存中进行 md5 检查。哦,如果您打算每次都推送到同一个文件,请阅读有关覆盖它的手册,如果没有特殊设置,它将无法正常工作。
【解决方案2】:

为了避免将文件保存到磁盘并“立即上传”,即在下载第一个数据块后立即开始推送到 FTP?

试试这个: http://www.php.net/manual/en/function.stream-copy-to-stream.php

您需要支持恢复上传的 FTP 服务器和客户端库

【讨论】:

  • +1 这可能行得通。除非你当然想要 md5 控件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2012-08-07
  • 2013-10-24
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
相关资源
最近更新 更多