2013-02-21 72 views
3

我正在尝试使用PHP从FTP URL下载文件,该文件看起来像ftp://username:[email protected]/file.zip。 该URL很好,因为我可以将该文件粘贴到任何浏览器中。 Fopen支持这种文件流式传输,在这里看到它:fopen。 这里是我的代码:通过FTP打开文件URL

[...] 
$destination_folder = '../importmlsupload/';  
$url = "ftp://user:[email protected]/file.zip"; 
$newfname = $destination_folder . basename($url); 
$file = fopen($url, "rb"); 
if ($file) { 
    $newf = fopen($newfname, "wb"); 
    while(!feof($file)) { 
     $s = fread($file, 1024); 
     fwrite($newf, $s, 1024); 
    } 
} 

if (!empty($file)) { 
    fclose($file); 
} 

if (!empty($newf)) { 
    fclose($newf); 
} 

问题是,我得到一个下载文件ampty。我做了一些验证,并得到了以下结果:文件已在服务器上成功创建,但while循环(!feof(...))在第一步之后结束。所以它读取1024个字节,并从循环中退出。换句话说,feof在第一个1024字节或读取后返回true。

使用HTTP URL TRYING成绩成功导入,但FTP URL不

难道我做错了什么?

回答

1

我没有试过你的代码,但是如果你有ftp的详细信息,你可以使用FTP functions来代替。这可能不是我所知道的适当答案。 :)

+0

谢谢我欣赏,如果我不会为这一个简单的解决方案,那么我会使用它们。 – Ervin 2013-02-21 10:32:51

1

嗨埃尔文和遗憾的回答迟!

我刚刚有同样的问题,我发现其实有两个答案。首先我尝试了file_get_contents。这是这样的:

$input = file_get_contents($url); 
$writtenChars = file_put_contents($newfname, $input); 

非常简单的工作,但我想只是为ASCII,如果你有相当长的一段记忆,因为这读取整个文件写入之前。我喜欢你的缓冲区方法。所以我做了以下事情:

$source = fopen($url, 'r'); 
$destination = fopen($newfname, 'w+'); 
while($data = fread($source, 1024)) { 
    fwrite($destination, $data); 
} 

这对我正在下载的XML文件正常工作。在模式参数fopen中执行'wb'时,您的二进制应该没问题。

我不知道为什么你的feof不起作用,对不起。但正如你在我的代码中看到的那样,你不需要它。