2012-08-31 162 views
1

我有一个可用的FTP文件下载脚本。
我下载的文件大约每天2-4 GB。
我想知道是否有一种方法来获取文件的百分比?PHP显示ftp_get进度的百分比?

我看过php.net和这里,但我找不到任何类似的问题,而是花更多的时间看我想我会问人比我更聪明。

我在想如果有一个函数可以看到它在下载的位置,但我找不到一个,因为ftp_get必须先完成,以便消除每隔几秒刷新一次缓冲区的机会新的百分比。

有人吗?

这是我的代码:我隐藏了所有的变量。

$conn_id = ftp_connect($ftp_server); 

$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 

if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) { 
    echo "Successfully written to $local_file\n"; 
} else { 
    echo "There was a problem\n"; 
} 

ftp_close($conn_id); 

编辑:

我加入ftp_nb_get这里是我的代码。它保持正常下载,只是不会将它回显给浏览器。

$ret = ftp_nb_get($conn_id, $local_file, $server_file, FTP_BINARY, $size); 
while ($ret == FTP_MOREDATA) { 
    echo round((filesize($local_file)/$server_size)*100)."%\n"; 
    $ret = ftp_nb_continue($conn_id); 
} 
+0

您可能最终会使用类似于此的方法:http://stackoverflow.com/questions/2885468/getting-ftp-put-progress作为基本的ftp_put/get本身不支持任何形式的回调或通过ajax检查中间结果。 – ahillman3

回答

1

尝试在循环中使用非阻塞版本ftp_nb_get()ftp_nb_continue(),并检查保存的文件的大小。

+0

谢谢,我现在就试试。 –

+0

我添加了一个编辑,你有什么想法吗? –

+0

PHP通常会缓冲输出,尝试在echo之后添加[flush()](http://php.net/manual/en/function.flush.php)以强制发送输出。如果你使用outputbuffers,可能需要[ob_get_flush()](http://php.net/manual/en/function.ob-get-flush.php)或类似的东西。 – complex857

-1

你应该尝试buffer flush - ob_flush()和flush()。

这项技术的工作原理,我已经使用它。 here is a tutorial

我相信你可以给自己多一些。 不仅仅是谷歌的“进步PHP刷新缓冲区”

0

可以实现轻松使用FTP URL protocol wrappers

$url = "ftp://username:[email protected]/remote/source/path/file.zip"; 

$size = filesize($url) or die("Cannot retrieve size file"); 

$hin = fopen($url, "rb") or die("Cannot open source file"); 
$hout = fopen("/local/dest/path/file.zip", "wb") or die("Cannot open destination file"); 

while (!feof($hin)) 
{ 
    $buf = fread($hin, 10240); 
    fwrite($hout, $buf); 
    echo "\r".intval(ftell($hout)/$size*100)."%"; 
} 

echo "\n"; 

fclose($hout); 
fclose($hin); 

关于你尝试使用ftp_nb_get
filesize缓存的结果,所以调用它一再将让你获得相同的价值。您必须致电clearstatcache

一个完整的代码如下:

$conn_id = ftp_connect("ftp.example.com"); 
ftp_login($conn_id, "username", "password"); 

ftp_pasv($conn_id, true); 

$local_path = "/local/dest/path/file.zip"; 
$remote_path = "/remote/source/path/file.zip"; 
$size = ftp_size($conn_id, $remote_path); 

$ret = ftp_nb_get($conn_id, $local_path, $remote_path, FTP_BINARY); 

while ($ret == FTP_MOREDATA) 
{ 
    clearstatcache(false, $local_path); 
    echo "\r".intval(filesize($local_path)/$size*100)."%"; 
    $ret = ftp_nb_continue($conn_id); 
} 

echo "\n"; 

或者使用ftp_nb_fget和查询文件句柄,像我的第一个例子。