通过FTP URL fopen on file

时间:2013-02-21 09:25:29

标签: php download fopen feof

我正在尝试使用PHP从FTP URL下载文件,该文件看起来像ftp://username:password@domain/file.zip。 URL很好,因为我可以将文件下载到任何浏览器中。 Fopen支持这种文件流,只是在这里看到它:fopen。 这是我的代码:

[...]
$destination_folder = '../importmlsupload/';    
$url = "ftp://user:password@domain/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);
}

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

尝试使用HTTP网址导致成功导入,但FTP网址不能

我做错了吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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文件。在'wb'模式参数中执行fopen时,您的二进制文件应该没问题。

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