2

我有一个有效的 FTP 文件下载脚本。
我下载的文件每天大约 2-4 GB。
我想知道是否有办法获取文件所在位置的百分比?

我在 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);
}
4

3 回答 3

2

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

于 2012-08-31T13:15:48.390 回答
0

它可以使用FTP URL 协议包装器轻松实现:

$url = "ftp://username:password@ftp.example.com/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:缓存结果,因此重复调用它会得到相同的值。你必须打电话。
filesizeclearstatcache

完整的代码如下:

$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和查询文件句柄,就像我的第一个例子一样。

于 2017-11-23T07:22:13.550 回答
-1

You should try buffer flush - ob_flush() and flush().

This technique works, I already used it. here is a tutorial

I am sure that you can wind yourself some more. Just google "progress php flush buffer"

于 2014-01-12T20:57:08.067 回答