如何在PHP中通过FTP下载部分文件?

如何在PHP中通过FTP下载部分文件?,php,ftp,download,Php,Ftp,Download,我想在FTP服务器上下载部分文件。我有一个解决方案: $opts = array('ftp'=>array('overwrite'=>false, 'resume_pos'=> 5*16+12)); $context = stream_context_create($opts); $version = file_get_contents ( 'ftp://'.$ftpAccount["username"].':'.$ftpAccoun

我想在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
    );

我不喜欢这个解决方案,因为它会为每个文件打开新的连接。有谁知道更好的解决方案(有效的解决方案)吗?

这里有一个与curl库类似的问题。


与http不同,您似乎无法使用ftp重复使用连接。

这里有一个与curl库类似的问题。


与http不同,您似乎无法使用ftp重复使用连接。

我自己在寻找此问题的解决方案时遇到了此页面。我什么也没找到,所以我自己编了些东西

也许不是最漂亮的解决方案,但这对我来说很有效:

它以512000字节的块下载远程文件。下载所有区块后,它会将本地文件放在一起并删除区块。它总是覆盖本地文件(事实上,在开始向本地文件写入块之前,它会删除本地文件)

我希望这对某人有帮助

我想如果我愿意让它更干净,我也可以使用curl来确定远程文件的大小。但我更像是“管道胶带程序员”。它是这样工作的,这就是对我来说最重要的:——)

$server='…'//例如ftp.testftp.nl
$full_remoteURI='…';//例如ftp://ftp.testftp.nl/exports/dump.xml
$username=“…”;
$passwrd=“…”;
$remote_ftp_path='…';//例如:出口
$remote_filename='…';
$local_filename='…';
$ftpconnect=ftp\u connect($server);
如果($ftpconnect)$login=ftp\u login($ftpconnect,$username,$passwrd);
否则打印“FTP详细绑定mislukt.

\n”; 如果($login){ ftp\u chdir($ftpconnect,$remote\u ftp\u path); $fsize=ftp\u大小($ftpconnect,$remote\u文件名); 如果(isset($\u GET['f']))$f=$\u GET['f']; 否则$f=0; 如果($f>0)$start=($f*512001); 否则$start=0; 如果($start<$fsize){ $curl=curl_init(); $file=fopen($local_filename.$f,'w'); curl_setopt($curl,CURLOPT_URL,$full_remoteURI);#输入 curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); curl_setopt($curl,CURLOPT_FILE,$FILE);#输出 curl_setopt($curl,CURLOPT_RANGE,$start.“-”($start+512000)); curl_setopt($curl,CURLOPT_USERPWD,$username.:“$passwrd); curl_exec($curl); $voltooid=数字\格式(100*$start/$fsize,0,,“”); 打印“XML bestanden下载$voltooid%

\n”; } 否则{ $del=取消链接($local_filename); 如果(!$del)打印“Oude bestand verwijderen mislukt!

\n”; $fh=fopen($local_filename,'w'); 对于($i=0;$i<$f;$i++){ $data=file\u get\u contents($local\u filename.$i); fwrite($fh,$data); 取消链接($local_filename.$i); } fclose($fh); 打印“下载的voltooid.

\n”; } } 否则打印“登录失败

\n”;
我自己在寻找这个问题的解决方案时遇到了这个页面。我什么也没找到,所以我自己编了些东西

也许不是最漂亮的解决方案,但这对我来说很有效:

它以512000字节的块下载远程文件。下载所有区块后,它会将本地文件放在一起并删除区块。它总是覆盖本地文件(事实上,在开始向本地文件写入块之前,它会删除本地文件)

我希望这对某人有帮助

我想如果我愿意让它更干净,我也可以使用curl来确定远程文件的大小。但我更像是“管道胶带程序员”。它是这样工作的,这就是对我来说最重要的:——)

$server='…'//例如ftp.testftp.nl
$full_remoteURI='…';//例如ftp://ftp.testftp.nl/exports/dump.xml
$username=“…”;
$passwrd=“…”;
$remote_ftp_path='…';//例如:出口
$remote_filename='…';
$local_filename='…';
$ftpconnect=ftp\u connect($server);
如果($ftpconnect)$login=ftp\u login($ftpconnect,$username,$passwrd);
否则打印“FTP详细绑定mislukt.

\n”; 如果($login){ ftp\u chdir($ftpconnect,$remote\u ftp\u path); $fsize=ftp\u大小($ftpconnect,$remote\u文件名); 如果(isset($\u GET['f']))$f=$\u GET['f']; 否则$f=0; 如果($f>0)$start=($f*512001); 否则$start=0; 如果($start<$fsize){ $curl=curl_init(); $file=fopen($local_filename.$f,'w'); curl_setopt($curl,CURLOPT_URL,$full_remoteURI);#输入 curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); curl_setopt($curl,CURLOPT_FILE,$FILE);#输出 curl_setopt($curl,CURLOPT_RANGE,$start.“-”($start+512000)); curl_setopt($curl,CURLOPT_USERPWD,$username.:“$passwrd); curl_exec($curl); $voltooid=数字\格式(100*$start/$fsize,0,,“”); 打印“XML bestanden下载$voltooid%

\n”; } 否则{ $del=取消链接($local_filename); 如果(!$del)打印“Oude bestand verwijderen mislukt!

\n”; $fh=fopen($local_filename,'w'); 对于($i=0;$i<$f;$i++){ $data=file\u get\u contents($local\u filename.$i); fwrite($fh,$data); 取消链接($local_filename.$i); } fclose($fh); 打印“下载的voltooid.

\n”; } } 否则打印“登录失败

\n”;
$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";