Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-从URL下载并通过FTP上传_Php_Ftp_Fopen_Ftps - Fatal编程技术网

PHP-从URL下载并通过FTP上传

PHP-从URL下载并通过FTP上传,php,ftp,fopen,ftps,Php,Ftp,Fopen,Ftps,这里有点奇怪的概念。。。我们的一个客户希望通过FTP/S将数据推送到他们那里 我们的想法是通过从URL下载一个CSV文件来下载我们的一份报告,然后通过FTP/S将其推送到客户端。我知道我可以使用wget和FTP在bash脚本中实现这一点,但需要通过web界面添加到报告中,因此PHP是最好的方法 由于这是一项背景任务,我可以延长暂停时间等 我也知道我可以使用fopen下载和保存一个文件,然后找到它并使用PHP FTP库上传它。只是想找到一种使用fopen下载的方法,将数据保存在内存中以便立即上传

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

我们的想法是通过从URL下载一个CSV文件来下载我们的一份报告,然后通过FTP/S将其推送到客户端。我知道我可以使用wget和FTP在bash脚本中实现这一点,但需要通过web界面添加到报告中,因此PHP是最好的方法

由于这是一项背景任务,我可以延长暂停时间等

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


提前感谢您的帮助

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

我发现一种最简单的方法是使用file\u get\u内容,但缺乏可靠性和错误处理

例如:

$url = 'http://www.domain.com/csvfile';
$data = file_get_contents($url);
现在,您的csv数据以$data格式显示,接下来介绍如何将其推送到ftp服务器

同样,最简单的方法是使用上面的get示例中使用的内置流包装器。但是请注意,这需要PHP4.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

试试这个:


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

使用现有工具,而不是编写自己的工具。你们也可以从PHP调用它们,我不认为你们可以直接从内存上传文件。您应该将其保存到本地文件夹中,然后在成功上载之后;删除它。@Arda,你想错了,但你的第二句话当然是正确的意见,但它并不总是适用。@hakre,在某些情况下这就足够了,但我的经验告诉我,在很多情况下,情况正好相反。@Peter:我认为包装器算是一个现有的工具:为此干杯-我想下载更多关于它的内容,然后重新上传,这样我就可以在上传之前和之后对文件运行一些md5检查,以检查完整性——不过我将尝试用这段代码实现这一点:您也可以在内存中执行md5检查。哦,如果你打算每次都推到同一个文件,请阅读关于覆盖的手册,如果没有特殊设置,它是不起作用的。+1可能会起作用。当然,除非你想要md5控件。