Barra de progreso de Uploads en PHP sin Flash
Hace ya tiempo que conozco/uso APC, una librería para PHP cuyo propósito es acelerar la ejecución y optimizar el consumo de recursos de nuestros scripts mediante el cacheo de opcodes.
Para mi sorpresa, hoy descubro que APC cuenta además con algunos extras como la directiva rfc1867 (compatible con php 5.2 y superior) que nos permite crear barras de progreso para uploads, sin hacer uso de flash, como se muestra en el siguiente video.
Lo primero es instalar APC, puedes seguir la guía de php.net. Una vez instalado será suficiente con añadir estas dos líneas en el php.ini y reiniciar apache.
extension=php_apc.dll
apc.rfc1867 = On
El formulario

El formulario de upload requerirá de un identificador único, bastara con añadir un campo oculto;
<input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="<?php echo $unique_id?>"/>
PHP
Llegado a este punto toca crear un script php que nos muestre el estado del envió, este será consultado cada cierto tiempo con llamadas ajax.
<?php
if(isset($_GET['progress_key'])) {
$status = apc_fetch('upload_'.$_GET['progress_key']);
echo $status['current']/$status['total']*100;
}
?>
Javascript
Ya solo nos quedaría el código javascript que lanza las llamadas ajax. Es importante no olvidarnos de enviar el identificador del upload en la llamada.
function getProgress(){
GDownloadUrl("getprogress.php?progress_key=<?php echo($unique_id)?>",
function(percent, responseCode) {
document.getElementById("progressinner").style.width = percent+"%";
if (percent < 100){
setTimeout("getProgress()", 100);
}
});
}
function startProgress(){
document.getElementById("progressouter").style.display="block";
setTimeout("getProgress()", 1000);
}
Y Eso es todo. En este y este enlace encontrareis más información y un .zip en descarga directa con todos los archivos ,a modo de demo, listos para probar.
Ningun post realacionado

HaxeR on Septiembre 17th, 2009
Abra que probarlo
Joan on Septiembre 17th, 2009
Mira que llevo tiempo y tiempo buscando y es una de las cosas que más me ha costado encontrar. Al final me quedé con una solución de jQuery, pero esto es realmente interesante.
Gracias
flmn on Septiembre 17th, 2009
Fe de erratas:
En lo referente a el php.ini la linea “extension=php_apc.dll” estaba duplicada. Se me fue la mano con el copy & paste, sorry
Fran on Octubre 15th, 2009
¿Y si el formulario tiene múltiples archivos? ¿valdría esta solución?
flmn on Octubre 20th, 2009
Fran:
Nunca he hecho la prueba y no podría garantizartelo pero, así a priori, debería funcionar sin problema