我正在尝试使用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网址不能
我做错了吗?
答案 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
不起作用,抱歉。但正如你在我的代码中看到的那样,无论如何你都不需要它。