获取 ftp_put 进度

Bil*_*iam 5 php ftp ajax

我在 Web 服务器上有一个 php 脚本,它通过 ftp_put 将文件上传到另一个远程服务器。

如何向用户显示当前的上传进度?

我见过的唯一类似的系统是从用户上传文件,使用 ajax 请求检查服务器上上传文件的本地大小。

等效的系统将是对 Web 服务器的 ajax 请求,然后检查远程服务器上的文件大小并将该数据返回到用户的客户端脚本。

这对我来说似乎非常低效。有没有更好的办法?

dev*_*ler 1

如果其他机器上的 ftp 服务器支持REST命令(从某个点重新开始上传),则有一种肮脏的方法可以实现此目的:

  1. 创建临时文件
  2. 将您要上传的文件中的 X 字节放入该文件中
  3. 上传临时文件
  4. 将状态写入另一个文件(或会话,但不确定它是否有效)
  5. 将另外 X 个字节附加到临时文件
  6. 上传从 X 字节开始的临时文件
  7. 将状态写入文件
  8. 重复5-7直到整个文件上传完毕
  9. 删除临时和状态文件。

示例代码:

$fs = filesize('file.bin');
define('FTP_CHUNK_SIZE', intval($fs * 0.1) ); // upload ~10% per iteration

$ftp = ftp_connect('localhost') or die('Unable to connect to FTP server');
ftp_login($ftp, 'login', 'pass') or die('FTP login failed');

$localfile = fopen('file.bin','rb');

$i = 0;
while( $i < $fs )
{
    $tmpfile = fopen('tmp_ftp_upload.bin','ab');
    fwrite($tmpfile, fread($localfile, FTP_CHUNK_SIZE));
    fclose($tmpfile);

    ftp_put($ftp, 'remote_file.bin', 'tmp_ftp_upload.bin', FTP_BINARY, $i);
    // Remember to put $i as last argument above

    $progress = (100 * round( ($i += FTP_CHUNK_SIZE)  / $fs, 2 ));
    file_put_contents('ftp_progress.txt', "Progress: {$progress}%");
}
fclose($localfile);
unlink('ftp_progress.txt');
unlink('tmp_ftp_upload.bin'); // delete when done
Run Code Online (Sandbox Code Playgroud)

并使用 ajax 文件进行检查:

if(file_exists('ftp_progress.txt'))
    echo file_get_contents('ftp_progress.txt');
else
    echo 'Progress: 0%';
exit;
Run Code Online (Sandbox Code Playgroud)