3

我正在尝试使用 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 URL 结果导入成功,但 FTP URL 不成功

难道我做错了什么?

4

2 回答 2

2

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

于 2013-02-21T09:37:27.353 回答
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'mode 参数中执行时,您的二进制文件应该没问题fopen

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

于 2013-03-19T17:51:50.090 回答