Пример отправки файла на сервер с указанием сколько загруженно/осталось

filemanager.php

session_start();

// определяем временную директорию, куда грузятся файлы на сервер
$tmp_dir = '';

if (!isset($_SESSION['upload_tmp_dir']))
{
    $tmp_dir_ok = false;

    $tmp_dir = ini_get('upload_tmp_dir');

    $tmp_dir_ok = true;

    // если директива upload_tmp_dir не задана в php.ini, то
    if (!is_dir($tmp_dir) || $tmp_dir=='')
    {
        // искуссвенным путем определяем временную директорию в системе
        $tmp_dir = dirname(tempnam('127631782631827', 'foo'));

        if (!is_dir($tmp_dir))
        {
            echo "<script>alert('Не удается определить временную директорию системы.');</script>";
            $tmp_dir_ok = false;
        }
    }

    // сохраняем значение временной директории в сессии
    if ($tmp_dir_ok)
    {
        $_SESSION['upload_tmp_dir'] = $tmp_dir;
    }
}
?>
<html>
<head>
<meta http-equiv="Pragma" content="no-cache">
<meta charset="utf-8">

<script>
var start_date = null;
var start_time = null;                  // время, прошедшее в миллисекундах
var time_limit = 30;                    // тайм-лимит в секундах для опроса сервера
var r = false;                          // XMLHttpRequest-object
var secs_elapsed = 0;                   // время прошедшее с момента загрузки
var uploaded = false;                   // флаг загрузки

function uploadFile()
{
    if (document.forms[0].upload_file.value!='')
    {
        document.getElementById('progressMess').innerHTML = 'Подождите ответа сервера...';
        document.forms[0].btnupload.disabled = true;
        start_date = new Date();
        start_time = start_date.getTime();
        uploaded = false;
        document.getElementById('progressProcents').style.width = '0%';
        setTimeout("document.forms[0].submit()", 1000);
        request();
    }
    else
    {   alert('Не выбран файл!');
        return false;
    }
}

/**
 * Выполняет асинхронный запрос к серверу
 */
function request()
{
    var n = new Date();
    var current_time = n.getTime();

    secs_elapsed = Math.round((current_time-start_time)/1000);
    iSecs = secs_elapsed%60;
    document.getElementById('progressTime').innerHTML = '00:'+ (iSecs>9 ? iSecs : '0'+iSecs);
    if (secs_elapsed>=time_limit)
    {
        document.getElementById('progressMess').innerHTML = 'Время ожидания истекло...';
        document.forms[0].btnupload.disabled = false;
        return false;
    }

    r = false;
    try {
        r = new XMLHttpRequest();
    }
    catch(trymicrosoft)
    {
        try {
            r = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (othermicrosoft)
        {
            try {
                r = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(failed) { r = false; }
        }
    }

    if (!r)
    {
        alert("Error initializing XMLHttpRequest! Your browser does not support XMLHttpRequest object.");
        window.close();
        return false;
    }

    r.open('GET', 'whileuploading.php', true);
    r.onreadystatechange = progressUpdate;
    r.send(null);
}

/**
 * Проверяет состояние запроса и обновляет содержимое страницы.
 */
function progressUpdate()
{
    if (r.readyState==4)
    {
        if (r.status==200)
        {
            /*  параметры возвращаются в формате
                current_human_filesize|current_filesize|total_filesize
            */
            var response = r.responseText;
            var t = response.split('|');

            if (t[0]!='undefined') uploaded = true;

            document.getElementById('progressBytes').innerHTML = response;

            /*if (t[1]>0 && t[2]>0)
            {
                runProgressBar(Math.round(t[1]/t[2]*100));
            }*/

            if (uploaded && t[0]=='undefined')      // загрузка уже выполнена
            {
                document.getElementById('progressMess').innerHTML = 'Загрузка завершена...';
                document.forms[0].btnupload.disabled = false;
                return;
            }
            setTimeout('request()', 1000);
        }
        else if (r.status == 404)
            alert("Error: request URL does not exist");
        else
            alert("Error: status code is " + r.status);
    }
}
</script>
</head>
<body>
<iframe name="upload_frame" src="upload.php" width="1" height="1" style="border: 0;"></iframe>

<form method="post" action="upload.php" enctype="multipart/form-data" target="upload_frame">
<table style="margin: 10px; border: 1px solid black; width: 60%;">
<tr>
    <td colspan="4"><input type="file" name="upload_file" class="input"></td>
</tr>
<tr>
    <td width="12%"><b>Загружено</b>:</td>
    <td width="16%" nowrap><span id="progressBytes" style="color: blue; font-size: 13px">undefined</span></td>
    <td width="10%" nowrap><span id="progressProcents">0</span> %</td>
    <td width="62%"><span id="progressMess"> </span></td>
</tr>
<tr>
    <td><b>Время</b>:</td>
    <td colspan="3"><span id="progressTime">00:00</span> сек.</td>
</tr>
<tr>
    <td colspan="4"><input type="button" name="btnupload" value="Загрузить" onClick="uploadFile();"></td>
</tr>
</table>
</form>
</body>
</html>

upload.php

// определяем размер загружаемого файла и запоминаем значение в файле
$content_length = isset($_SERVER['CONTENT_LENGTH']) ? $_SERVER['CONTENT_LENGTH'] : 0;

$fp = fopen('filesize', 'w');
fwrite($fp, $content_length);
fclose($fp);

// move_uploaded_file() не используем, т.к. нужен сам факт загрузки файла на сервер

whileuploading.php

session_start();

// определяем временную директорию
$tmp_dir = isset($_SESSION['upload_tmp_dir']) ? $_SESSION['upload_tmp_dir'] : ini_get('upload_tmp_dir');

// общий размер загружаемого файла на сервер
$content_length = file_get_contents('filesize');

// очищаем кэш состояния файлов
clearstatcache();

$tmp_file = '';

if (isset($_SESSION['tmp_file']) && is_file($_SESSION['tmp_file']))
{
    $tmp_file = $_SESSION['tmp_file'];
}
else
{
    $tmp_file = findTemporaryFile($tmp_dir, '/[p][h][p]*');
}

// определяем размер временного файла и формируем вывод
if (false===($output = filesize($tmp_file)))
{
    $humanFileSize = 'undefined';
    $output = 0;
}
else
{
    $humanFileSize = humanFileSize($output);
}

$output = $humanFileSize.'|'.$output.'|'.$content_length;

header('Content-Length: '.strlen($output));
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');

echo $output;

/**
 * Ищет загружаемый файл во временной папке.
 * Возвращает имя временного файла в случае успеха.
 *
 * @param   string      $tmp_dir        имя временной директории, в которой ищется файл
 * @param   string      $pattern        шаблон, по которому ищутся файлы
 *
 * @return  boolean
 */
function findTemporaryFile($tmp_dir, $pattern)
{
    $found = false;

    if (is_dir($tmp_dir))
    {
        $phptempfiles = glob($tmp_dir.$pattern);

        if (count($phptempfiles)==1)
        {
            $found = $phptempfiles[0];
        }
    }

    return $found;
}

/**
 * Форматирует и возвращает представление размера файла в более удобочитаемое.
 *
 * @param   integer     $size       размер файла
 *
 * @return  string
 */
function humanFileSize($size)
{
    $filesizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
    return $size ? round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $filesizename[$i] : '0 Bytes';
}

.