我正试图使用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);
}
问题是我下载了一个ampty文件。我做了一些验证,得到了以下结果:文件在服务器上成功创建,但while循环(!feof(…))在第一步之后结束。因此,它读取1024个字节并退出循环。换句话说,feof在第一个1024字节或读取之后返回true。
尝试使用HTTP URL成功导入,但FTP URL未成功
我做错什么了吗?
我没有尝试你的代码,但如果你有ftp的详细信息,你可以使用ftp函数。这可能不是我知道的合适答案。:)
嗨,埃尔文,很抱歉回答晚了!
我只是遇到了同样的问题,实际上我找到了两个答案。首先我尝试了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
不起作用。但正如您在我的代码中看到的,您无论如何都不需要它。