Как загрузить часть файла через FTP в PHP? - PullRequest
1 голос
/ 10 февраля 2010

Я хотел бы загрузить части файлов на 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
    );

Мне не нравится это решение, потому что оно открывает новое соединение для каждого файла. Кто-нибудь знает лучшее решение (эффективное)?

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

Вот аналогичный вопрос, заданный для библиотеки curl. http://curl.haxx.se/mail/lib-2005-01/0176.html

Похоже, вы не можете повторно использовать соединения с ftp, в отличие от http.

0 голосов
/ 02 марта 2012

Я наткнулся на эту страницу, когда сам искал решение этой проблемы. Я ничего не нашел, поэтому сам что-то придумал.

Может быть, не самое красивое решение, но у меня это сработало:

Загружает удаленный файл кусками по 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...