是否可以使用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 ...
}
}
答案 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
上传了多少字节。
顺便说一句,你有一些错误:
您应该检查ftp_nb_put
的结果,方法与检查ftp_nb_continue
的结果相同,因为转移始于前者,而不是后者;
当看到FTP_MOREDATA
时,您的循环停止,但只有当FTP_MOREDATA
... 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);
在浏览器中显示结果: