2010-02-10 84 views
0

我想在FTP服務器上下載部分文件。我有這樣的解決方案:如何在PHP中通過FTP下載文件的一部分?

$opts = array('ftp'=>array('overwrite'=>false, 'resume_pos'=> 5*16+12));  
    $context = stream_context_create($opts); 

    $version = file_get_contents 
    (
    'ftp://'.$ftpAccount["username"].':'.$ftpAccount["password"].'@'.$ftpAccount["server"].'/firm/'.$file, FILE_BINARY, $context, -1, 20 
    ); 

因爲它打開每個文件的新的連接,我不喜歡這種解決方案。有人知道更好的解決方案(有效的)嗎?

謝謝!

回答

0

當我自己尋找這個問題的解決方案時,我遇到了這個頁面。我什麼也沒找到,所以我自己創造了一些東西。

可能不是最漂亮的解決方案,但這個工作對我來說:

它下載在512000個字節的塊遠程文件。當所有的塊被下載時,它將放在一起的本地文件並刪除塊。它總是覆蓋本地文件(實際上它在開始將塊寫入它之前會刪除本地文件)。

我希望這可以幫助別人。

我想如果我願意讓它更乾淨我也可以使用curl來確定遠程文件的大小。但我更像是'管道磁帶程序員'。它以這種方式工作,這對我來說很重要:-)

$server = '...'; //for example ftp.testftp.nl 
$full_remoteURI = '...'; // for example ftp://ftp.testftp.nl/exports/dump.xml 
$username = '...'; 
$passwrd = '...'; 
$remote_ftp_path = '...'; // for exmple /exports 
$remote_filename = '...'; 
$local_filename = '...'; 

    $ftpconnect = ftp_connect($server); 
    if($ftpconnect) $login = ftp_login($ftpconnect, $username, $passwrd); 
    else print "<p>FTP verbinding mislukt.</p>\n"; 
    if($login) { 
    ftp_chdir($ftpconnect, $remote_ftp_path); 
    $fsize = ftp_size($ftpconnect, $remote_filename); 
     if(isset($_GET['f'])) $f = $_GET['f']; 
     else $f = 0; 
     if($f > 0) $start = ($f * 512001); 
     else $start = 0; 
     if($start < $fsize) { 
     $curl = curl_init(); 
     $file = fopen($local_filename . $f, 'w'); 
     curl_setopt($curl, CURLOPT_URL, $full_remoteURI); #input 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($curl, CURLOPT_FILE, $file); #output 
     curl_setopt($curl, CURLOPT_RANGE, $start . "-" . ($start + 512000)); 
     curl_setopt($curl, CURLOPT_USERPWD, $username . ":" . $passwrd); 
     curl_exec($curl); 
     $voltooid = number_format(100 * $start/$fsize, 0, '',''); 
     print "<p>XML bestanden downloaden $voltooid %.</p> 
     <script type=\"text/javascript\"> 
     <!-- 
     document.onload = top.location = 'sync.php?f=" . ($f + 1) . "'; 
     --> 
     </script>\n"; 
     } 
     else { 
      $del = unlink($local_filename); 
      if(!$del) print "<p>Oude bestand verwijderen mislukt!</p>\n"; 
      $fh = fopen($local_filename, 'w'); 
      for($i = 0; $i < $f; $i++) { 
       $data = file_get_contents($local_filename . $i); 
       fwrite($fh, $data); 
       unlink($local_filename . $i); 
      } 
      fclose($fh); 
      print "<p>Downloaden voltooid.</p>\n"; 
     } 
    } 
    else print "<p>Login failed</p>\n"; 
相關問題