Регистрация Войти
Войти через VK Войти через FB Войти через Google Войти через Яндекс
Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Пример отправки файла на сервер с указанием сколько загруженно/осталось
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';
}
.
Прокомментировать/Отблагодарить