2013-02-21 76 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不起作用,對不起。但正如你在我的代碼中看到的那樣,你不需要它。