2010-02-10 61 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"; 
相关问题