¿Alguien sabe cómo obtener una barra de progreso para una carga en php? Estoy intentando escribir código para un cargador de álbumes de fotos. Me gustaría que se muestre una barra de progreso mientras se cargan las fotos.
Soy bastante nuevo en php, así que no sé todo al respecto.
php
upload
progress-bar
Josh Curren
fuente
fuente
Respuestas:
Este es, con mucho, (después de horas de buscar en Google y probar scripts) el más simple de configurar y el mejor cargador que he encontrado
https://github.com/FineUploader/fine-uploader
No requiere APC ni ninguna otra biblioteca PHP externa, puedo obtener comentarios sobre el progreso del archivo en un host compartido y afirma ser compatible con la función de arrastrar y soltar html5 (no probado personalmente) y la carga de múltiples archivos.
fuente
Si tiene APC instalado, tiene un gancho de devolución de llamada para el progreso de la carga.
Rasmus Lerdorf (creador de PHP) tiene una muestra de esto usando YUI (ah, y aquí está la fuente de PHP ).
Consulte la documentación aquí .
fuente
Lamento decir que, a mi leal saber y entender, una barra de progreso de carga de PHP pura, o incluso una barra de progreso de carga de PHP / Javascript, no es posible debido a cómo funciona PHP. Su mejor opción es utilizar algún tipo de cargador Flash.
AFAIK Esto se debe a que su script no se ejecuta hasta que todas las superglobales estén pobladas, lo que incluye $ _FILES. Para cuando se llama a su script PHP, el archivo está completamente cargado.
EDITAR: Esto ya no es cierto. Fue en 2010.
fuente
Una forma PHP-ish (5.2+) y sin Flash que funcionó muy bien para mí:
Primero, vea esta publicación que explica cómo poner en funcionamiento la extensión "uploadprogress".
Luego, en la página que contiene el formulario desde el que está cargando archivos, cree el siguiente iframe:
<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe>
A continuación, agregue este código a su botón "Enviar":
onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);"
Ahora tiene un iframe oculto en su formulario que se hará visible y mostrará el contenido de uploadprogress.php cuando haga clic en "Enviar" para comenzar a cargar archivos. $ upload_id debe ser el mismo que está utilizando como valor del campo oculto "UPLOAD_IDENTIFIER" en su formulario.
El uploadprogress.php en sí mismo se ve así (arregle y ajuste a sus necesidades):
<html> <head> <META HTTP-EQUIV='REFRESH' CONTENT='1;URL=?id=<?=$_GET['id']?>'> </head> <body> Upload progress:<br /> <?php if(!$_GET['id']) die; $info = uploadprogress_get_info($_GET['id']); $kbytes_total = round($info['bytes_total'] / 1024); $kbytes_uploaded = round($info['bytes_uploaded'] / 1024); echo $kbytes_uploaded.'/'.$kbytes_total.' KB'; ?> </body> </html>
Tenga en cuenta que se actualiza automáticamente cada segundo. Seguramente puede agregar una barra de progreso visual agradable aquí (como 2 <div> s anidados con diferentes colores) si lo desea. El iframe con progreso de carga, naturalmente, solo funciona mientras la carga está en progreso y finaliza su vida visible una vez que se envía el formulario y el navegador se vuelve a cargar en la página siguiente.
fuente
La implementación de la barra de progreso de carga es fácil y no requiere ninguna extensión adicional de PHP, JavaScript o Flash. Pero necesita PHP 5.4 y versiones posteriores .
Usted tiene que permitir la recogida de la información de progreso de carga mediante el establecimiento de la directiva
session.upload_progress.enabled
aOn
enphp.ini
.Luego, agregue una entrada oculta al formulario de carga HTML justo antes de cualquier otra entrada de archivo. El atributo HTML
name
de esa entrada oculta debe ser el mismo que el valor de la directivasession.upload_progress.name
dephp.ini
(eventualmente precedido porsession.upload_progress.prefix
). Elvalue
atributo depende de usted, se utilizará como parte de la clave de sesión.El formulario HTML podría verse así:
<form action="upload.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="<?php echo ini_get('session.upload_progress.prefix').ini_get('session.upload_progress.name'); ?>" value="myupload" /> <input type="file" name="file1" /> <input type="submit" /> </form>
Cuando envíe este formulario, PHP debería crear una nueva clave en la
$_SESSION
estructura superglobal que se completará con la información del estado de carga. La clave está concatenadaname
yvalue
de la entrada oculta.En PHP puede echar un vistazo a la información de carga completa:
var_dump($_SESSION[ ini_get('session.upload_progress.prefix') .ini_get('session.upload_progress.name') .'_myupload' ]);
La salida tendrá un aspecto similar al siguiente:
$_SESSION["upload_progress_myupload"] = array( "start_time" => 1234567890, // The request time "content_length" => 57343257, // POST content length "bytes_processed" => 54321, // Amount of bytes received and processed "done" => false, // true when the POST handler has finished, successfully or not "files" => array( 0 => array( "field_name" => "file1", // Name of the <input /> field // The following 3 elements equals those in $_FILES "name" => "filename.ext", "tmp_name" => "/tmp/phpxxxxxx", "error" => 0, "done" => false, // True when the POST handler has finished handling this file "start_time" => 1234567890, // When this file has started to be processed "bytes_processed" => 54321, // Number of bytes received and processed for this file ) ) );
Hay toda la información necesaria para crear una barra de progreso: tiene la información si la carga aún está en progreso, la información de cuántos bytes se transferirán en total y cuántos bytes ya se han transferido.
Para presentar el progreso de la carga al usuario, escriba un script PHP diferente al de carga, que solo verá la información de carga en la sesión y la devolverá en formato JSON, por ejemplo. Este script se puede llamar periódicamente, por ejemplo, cada segundo, utilizando AJAX y la información presentada al usuario.
Incluso puede cancelar la carga configurando
$_SESSION[$key]['cancel_upload']
atrue
.Para obtener información detallada, configuraciones adicionales y comentarios del usuario, consulte el manual de PHP .
fuente
Otro cargador completo JS: http://developers.sirika.com/mfu/
que te diviertas
fuente
HTML5 introdujo una API de carga de archivos que le permite monitorear el progreso de las cargas de archivos, pero para los navegadores más antiguos, existe un marco de plupload diseñado específicamente para monitorear las cargas de archivos y brindar información sobre ellos. además, tiene muchas devoluciones de llamada para que funcione en todos los navegadores
fuente
Gears y HTML5 tienen un evento de progreso en el
HttpRequest
objeto para enviar una carga de archivo a través de AJAX.http://developer.mozilla.org/en/Using_files_from_web_applications
Sus otras opciones ya respondidas por otros son:
Técnicamente, hay una cuarta opción, similar a la carga de YouTube, con Gears o HTML5 puedes usar blobs para dividir un archivo en pequeños fragmentos y subir cada fragmento individualmente. Al finalizar cada fragmento, puede actualizar el estado de progreso.
fuente
Necesitaría usar Javascript para crear una barra de progreso. Una simple búsqueda en Google me llevó a este artículo: Barra de progreso de Javascript simple de WebAppers con CSS .
Widget de barra de progreso de carga de archivos Dojo es otra opción que utiliza el marco de Dojo Javascript.
EDITAR: Suponiendo que carga una gran cantidad de imágenes (como un álbum de fotos) y las envía a su script PHP, puede usar javascript para leer los resultados de la publicación y actualizar la barra de progreso según la cantidad de imágenes cargadas / número total de imágenes. Esto tiene el efecto secundario de actualizar solo después de que se haya completado cada publicación. Consulte aquí para obtener información sobre cómo publicar con JS.
fuente
Se puede hacer una barra de progreso de php / ajax. (Consulte la biblioteca Html_Ajax en pear). Sin embargo, esto requiere instalar un módulo personalizado en php.
Otros métodos requieren el uso de un iframe, a través del cual php busca ver cuánto del archivo se ha subido. Sin embargo, algunos complementos de los navegadores pueden bloquear este iframe oculto porque a menudo se utilizan iframes ocultos para enviar datos maliciosos a la computadora de un usuario.
Su mejor opción es utilizar algún tipo de barra de progreso flash si no tiene control sobre su servidor.
fuente