php - ftp_get - Предупреждение: ftp_get (): открытие подключения к данным в двоичном режиме - PullRequest
5 голосов
/ 23 марта 2010

Я пытаюсь написать скрипт, который будет загружать файлы с FTP-сервера. Они все довольно большие (почти 2 ГБ каждый). Сценарий запускается, но затем в конечном итоге завершается с указанной выше ошибкой. Это размер связан? Это можно обойти? Вот код:

<?php

$ftp_server = "ftp.EXAMPLE.com";
$conn_id = ftp_connect ($ftp_server) or die("Couldn't connect to $ftp_server");
$login_result = ftp_login($conn_id, "USERNAME", "PASSWORD");
if ((!$conn_id) || (!$login_result)) die("FTP Connection Failed");
ftp_sync("download");   
ftp_close($conn_id); 

$mkdir = date('Y-m-d');
mkdir('encrypted/'.$mkdir, 0777);
smartCopy("./download/", 'encrypted/'.$mkdir);
chmodr("encrypted/".$mkdir, 0777);

function ftp_sync ($dir) {

    global $conn_id;

    if ($dir != ".") {
        if (ftp_chdir($conn_id, $dir) == false) {
            echo ("Change Dir Failed: $dir<BR>\r\n");
            return;
        }
        if (!(is_dir($dir)))
            mkdir($dir);
        chdir ($dir);
    }

    $contents = ftp_nlist($conn_id, ".");
    foreach ($contents as $file) {

        if ($file == '.' || $file == '..')
            continue;

        if (@ftp_chdir($conn_id, $file)) {
            ftp_chdir ($conn_id, "..");
            ftp_sync ($file);
        }
        else
            ftp_get($conn_id, $file, $file, FTP_BINARY);
    }

    ftp_chdir ($conn_id, "..");
    chdir ("..");

}

function chmodr($path, $filemode) {
    if (!is_dir($path))
        return chmod($path, $filemode);

    $dh = opendir($path);
    while (($file = readdir($dh)) !== false) {
        if($file != '.' && $file != '..') {
            $fullpath = $path.'/'.$file;
            if(is_link($fullpath))
                return FALSE;
            elseif(!is_dir($fullpath) && !chmod($fullpath, $filemode))
                    return FALSE;
            elseif(!chmodr($fullpath, $filemode))
                return FALSE;
        }
    }

    closedir($dh);

    if(chmod($path, $filemode))
        return TRUE;
    else
        return FALSE;
}

function smartCopy($source, $dest, $folderPermission='0777',$filePermission='0777'){

    $result=false;

    if (is_file($source)) {
        if(is_dir($dest)) {
            if ($dest[strlen($dest)-1]!='/') 
                $__dest=$dest."/";
            $__dest .= basename($source);
            }
        else { 
            $__dest=$dest;
            }
        $result=copy($source, $__dest);
        chmod($__dest,$filePermission);
        }
    elseif(is_dir($source)) { 
        if(!is_dir($dest)) {
            @mkdir($dest,$folderPermission);
            chmod($dest,$folderPermission);
            }
        if ($source[strlen($source)-1]!='/') 
            $source=$source."/";
        if ($dest[strlen($dest)-1]!='/') 
            $dest=$dest."/";

        $return = true;
        $dirHandle=opendir($source);
        while($file=readdir($dirHandle)) { 
            if($file!="." && $file!="..") { 
                $result=smartCopy($source.$file, $dest.$file, $folderPermission, $filePermission);
                }
            }
        closedir($dirHandle);
        }
    else {
        $result=false;
        }
    return $result;
}

function deleteDirectory($dir) {
    if (!file_exists($dir)) return true;
    if (!is_dir($dir) || is_link($dir)) return unlink($dir);
        foreach (scandir($dir) as $item) {
            if ($item == '.' || $item == '..') continue;
            if (!deleteDirectory($dir . "/" . $item)) {
                chmod($dir . "/" . $item, 0777);
                if (!deleteDirectory($dir . "/" . $item)) return false;
            };
        }
        return rmdir($dir);
    } 
?>

Ответы [ 5 ]

17 голосов
/ 23 февраля 2012

У меня была похожая проблема, и я решил ее с помощью следующего.

ftp_pasv($conn_id, TRUE);  
6 голосов
/ 20 мая 2011

Для тех, кто может прийти с этим вопросом из-за той же проблемы. Для меня это было довольно просто, целевое местоположение для загрузки не было достаточно свободного места для файла.

2 голосов
/ 19 мая 2013

Попробуйте увеличить FTP_TIMEOUT (значение по умолчанию - 90)

ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 180);

Это прекрасно сработало для меня.

http://www.php.net/manual/en/function.ftp-set-option.php

0 голосов
/ 24 августа 2012

Попробуйте использовать ftp_close и ftp_connect для сброса FTP-соединения.

Я провел хороший день на этом, пробуя все, что смог найти (ftp_pasv, ftp_alloc, переход на FTP_ASCII / FTP_BINARY), но безуспешно.

На некоторых серверах установлены ограничения на объем загрузки за сеанс.

0 голосов
/ 23 марта 2010

Вы уверены, что каждый файл является двоичным?

Вы можете попытаться угадать тип файла по его расширению, чтобы настроить режим загрузки, как предлагается в этом комментарии: http://www.php.net/manual/fr/function.ftp-get.php#86516

...