2013-02-15 96 views
3

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

伪码

... 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 ... 
    } 
} 
+0

如果你知道哪些文件已经发出,为什么不使用文件大小()来计算的总额是多少? – 2013-02-15 18:31:15

+0

@John:OP正试图找到一种方法来确定我们在每个“块”中发送了多少个字节。事实上,在模块的API中似乎没有任何明显的机制来做到这一点。这是一个很好的问题。 – 2013-02-15 18:31:51

回答

2

奇怪的是(和颇为遗憾的是),不存在不出现任何的方式来确定有多少字节是由以前调用上传ftp_nb_continue,带有这个PHP扩展。

顺便说一句,你有几个误区:

  1. 您应该检查在您检查的ftp_nb_continue结果以同样的方式ftp_nb_put结果,由于转移与前开始,不后者;当FTP_MOREDATA看到

  2. 你的循环停止,但它应该停止,只有当FTP_MOREDATA看到。

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

谢谢...我想你可以通过另一个连接读取文件大小来获得它...虽然这是不可靠的... – Nick 2013-02-15 19:18:10

+0

@prggmr是的,正是 – 2013-02-15 22:20:39

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; 
}