PHP FTP转移金额

时间:2013-02-15 18:25:04

标签: php

是否可以使用PHP FTP module检测已传输的数据量?

伪代码

... connect to server
ftp_nb_put(file...)
while(true) {
    $data = ftp_nb_continue(file...);
    if ($data === FTP_MOREDATA) {
        continue ... get amount transfered ...
    } else {
        break ... check if finished etc ...
    }
}

3 个答案:

答案 0 :(得分:3)

你可能现在得到了一个答案,但对于任何搜索的人来说...... 这是一个带进度回调的ftp上传功能。 $ lcfn =本地文件名 $ rmfn =远程文件名

function ftp_upload($conn, $lcfn, $rmfn, $progress)
{
    $ret = false;

    $_pc = -1;
    $totalBytes = filesize($lcfn);

    $fp = fopen($lcfn, 'rb');

    $state = @ftp_nb_fput($conn, $rmfn, $fp, FTP_BINARY);

    if($state !== FTP_FAILED){

        while($state === FTP_MOREDATA){

            $doneSofar = ftell($fp);
            $percent = (integer)(($doneSofar / $totalBytes) * 100);

            if($_pc != $percent){
                $progress($percent);
                $_pc = $percent;
            }

            $state = @ftp_nb_continue($conn);
        }

        if($state === FTP_FINISHED){

            if($_pc != 100){
                $progress(100);
            }

            $ret = true;

        }else{
            //error: not finished
        }
    }else{
        //error: failure
    }

    fclose($fp);
    return $ret;
}

答案 1 :(得分:2)

奇怪(并且非常不幸), not 似乎无法通过此PHP扩展来确定前一次调用ftp_nb_continue上传了多少字节。

顺便说一句,你有一些错误:

  1. 您应该检查ftp_nb_put的结果,方法与检查ftp_nb_continue的结果相同,因为转移始于前者,而不是后者;

  2. 当看到FTP_MOREDATA时,您的循环停止,但只有当FTP_MOREDATA

    时才会停止。

  3. ... connect to server
    $result = ftp_nb_put(file...)
    while ($result === FTP_MOREDATA) {
        $result = ftp_nb_continue(file...);
    }
    

答案 2 :(得分:0)

对于任何想在进行文件传输时显示上传进度的人来说,这是一个很棒的php-ftp-client库:

代码

$interval = 1;
$ftp->asyncDownload('illustrations/assets.zip', 'assets.zip', function ($stat) use ($interval) {
    ob_end_clean();
    ob_start();

    echo sprintf(
        "speed : %s KB/%ss | percentage : %s%% | transferred : %s KB | second now : %s <br>",
        $stat['speed'],
        $interval,
        $stat['percentage'],
        $stat['transferred'],
        $stat['seconds']
    );

    ob_flush();
    flush();
}, true, $interval);

在浏览器中显示结果:

enter image description here