<form enctype="multipart/form-data" action="upload.php" method="POST"> <input name="uploaded" type="file" /> <input type="submit" value="Upload" /> </form> <?php if(isset($_REQUEST['submit'])){ $target = "data/".basename( $_FILES['uploaded']['name']) ; move_uploaded_file($_FILES['uploaded']['tmp_name'], $target); } ?>
我非常了解Javascript,AJAX和JQuery等,并且我相信可以使用PHP,AJAX和Javascript等创建上传进度栏。
我很惊讶如何获得上传的大小(意思是我想知道的每一秒,上传了多少文件,还有多少剩余,我认为应该可以使用AJAX等)文件正在上传中。
是否有其他方法可以使用PHP和AJAX显示上传进度栏,而无需使用任何外部PHP扩展?我无权使用php.ini
php.ini
它说的PHP文档非常详细
当正在进行上载时,以及在POST设置与session.upload_progress.name INI设置相同名称的变量时,上载进度将在$ _SESSION超级全局变量中可用。当PHP检测到此类POST请求时,它将在$ _SESSION中填充一个数组,其中索引是session.upload_progress.prefix和session.upload_progress.name INI选项的串联值。通常通过读取这些INI设置来检索密钥,即
PHP会话命名中已准备好您需要的所有信息
您需要提取的信息并以HTML形式显示。
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" /> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script> <script type="text/javascript"> var intval = null; var percentage = 0 ; function startMonitor() { $.getJSON('b.php', function (data) { if (data) { percentage = Math.round((data.bytes_processed / data.content_length) * 100); $("#progressbar").progressbar({value: percentage}); $('#progress-txt').html('Uploading ' + percentage + '%'); } if(!data || percentage == 100){ $('#progress-txt').html('Complete'); stopInterval(); } }); } function startInterval() { if (intval == null) { intval = window.setInterval(function () {startMonitor()}, 200) } else { stopInterval() } } function stopInterval() { if (intval != null) { window.clearInterval(intval) intval = null; $("#progressbar").hide(); $('#progress-txt').html('Complete'); } } startInterval(); </script>
session_start(); header('Content-type: application/json'); echo json_encode($_SESSION["upload_progress_upload"]);
这是PHP Session Upload Progress中更好的优化版本
$('#fileupload').bind('fileuploadsend', function (e, data) { // This feature is only useful for browsers which rely on the iframe transport: if (data.dataType.substr(0, 6) === 'iframe') { // Set PHP's session.upload_progress.name value: var progressObj = { name: 'PHP_SESSION_UPLOAD_PROGRESS', value: (new Date()).getTime() // pseudo unique ID }; data.formData.push(progressObj); // Start the progress polling: data.context.data('interval', setInterval(function () { $.get('progress.php', $.param([progressObj]), function (result) { // Trigger a fileupload progress event, // using the result as progress data: e = document.createEvent('Event'); e.initEvent('progress', false, true); $.extend(e, result); $('#fileupload').data('fileupload')._onProgress(e, data); }, 'json'); }, 1000)); // poll every second } }).bind('fileuploadalways', function (e, data) { clearInterval(data.context.data('interval')); });
$s = $_SESSION['upload_progress_'.intval($_GET['PHP_SESSION_UPLOAD_PROGRESS'])]; $progress = array( 'lengthComputable' => true, 'loaded' => $s['bytes_processed'], 'total' => $s['content_length'] ); echo json_encode($progress);