php - ftp_get - Uyarı: ftp_get (): Açılış BINARY modunda veri bağlantısı

5 Cevap php

Ben bir FTP sunucusundan dosya indirmek bir senaryo yazmaya çalışıyorum. Onlar (yaklaşık 2GB her biri) tüm oldukça geniş demektir. Komut dosyası çalışmaya başlar, ancak sonra sonunda yukarıdaki hata ile sonlanır. Bu boyutu ile ilgili mi? Bu etrafında bir yolu var mı? İşte kod:

<?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 Cevap

Her dosya ikili olduğundan emin misin?

Bu açıklama içinde önerildiği gibi, yükleme modunu ayarlamak için kendi uzantısı dosya türünü tahmin deneyebilirsiniz: http://www.php.net/manual/fr/function.ftp-get.php#86516

Ben benzer bir sorunu olan ve aşağıdaki kullanıyordum benim için çözüldü.

ftp_pasv($conn_id, TRUE);  

Çünkü aynı sorunu olan bu soru ile gelebilir herkes için. Benim için oldukça basit, indirmek için hedef konum dosyası için yeterli boş alan yoktu.

FTP bağlantısı sıfırlamak için ftp_close ve ftp_connect kullanmayı deneyin.

Ben hiçbir başarı ile, (FTP_ASCII / FTP_BINARY değişen, ftp_alloc, ftp_pasv) bulabildiğim her şeyi deneyerek, bu bir iyi bir gün geçirmişti.

Bazı sunucular oturum başına yükleyebilirsiniz ne kadar sınırları var.

FTP_TIMEOUT (varsayılan değer 90) artırmaya çalışın

ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 180);

Bu benim için mükemmel çalıştı.

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