Foros del Web » Programando para Internet » PHP »

Mensaje de progreso al hacer upload al servidor.

Estas en el tema de Mensaje de progreso al hacer upload al servidor. en el foro de PHP en Foros del Web. Me gustaría poner algún mensaje de progreso o imagen al hacer upload, durante ese ratito que tarda en llegar el archivo al servidor y pasar ...
  #1 (permalink)  
Antiguo 06/01/2004, 17:54
wpp
 
Fecha de Ingreso: noviembre-2003
Mensajes: 50
Antigüedad: 14 años, 1 mes
Puntos: 0
Mensaje de progreso al hacer upload al servidor.

Me gustaría poner algún mensaje de progreso o imagen al hacer upload, durante ese ratito que tarda en llegar el archivo al servidor y pasar a la página de respuesta.
No sé si se podrá hacer en php o alomejor insertar un javascript, pero la verdad no sé por donde empezar.
Gracias, espero haberme explicado.
  #2 (permalink)  
Antiguo 07/01/2004, 06:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Desde PHP .. podrías "lanzar" algun "pop-up" (ventana javascript) que diga algo tipo "subiendo imagen" y .. al terminar el proceso de upload cerrar esa ventana (via javascript) o cambiar el mensaje. Pero .. lo que no se puede hacer desde PHP es hacer una barrar de progreso "exacta" ya que PHP no informa al servidor HTTP del estado de un upload HTTP (otros lenguajes como Perl parece que sí).

El psudo-código sería algo así:

1) tu formulario HTML donde subes la imagen .. ante el botón "submit" usando algún evento onSumit() o similar de Javascript abre una ventana (pop-up o similar) con la llamada a la pàgina que muestre ese mensaje de "subiendo imagen".

2) En PHP (tu script de proceso) .. Al recibir completamente el archivo .. PHP continua el proceso del script .. es más .. puedes revisar si llegó completamente el archivo con funciones como: is_uploaded_file() (pero no puedes usar algún tipo de bucle a la espera como para poder hacer tu barra de progreso). Esa función te devuelve un boolean (true/false) .. así que cuando sea "true" (usalo en un condicional IF() ..) puedes ejecutar el código -javascirpt- que cierre esa ventana que abristes en el punto 1 o bien cargar otra página con otro mensaje en esa ventana que abriste.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 07/01/2004, 06:36
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 16 años, 1 mes
Puntos: 5
Buenas chicos os voy a dar una buena noticia justo lo que quieres hacer se puede hacer con PHP jeje eso si con PHP5 ya que tiene incorporado un nuevo sistema (mejorado) de upload de archivos. Aqui os dejo un code que vi en su dia en una web (no la recuerdo):

Código PHP:

<?

$close_popup_window_when_done 
1;


function 
read_progress_metter() {
   
$X = array ( 
        
"time_start" => 0,
        
"time_last"  => 0,
        
"speed_average" => 0,
        
"speed_last" => 0,
        
"bytes_uploaded" => 0,
        
"bytes_total" => 1,
        
"files_uploaded" => 0,
        
"eta" => 0
        
);

   
$file get_progress_metter_file();
   if (!
$file) return FALSE;

   
$F = @fopen($file"r");
   if (!
$F) return $X;

   
   while (!
feof ($F)) {
      
$buffer fgets($F100);
      if (
preg_match('/(\w+)=(\d+)/'$buffer$matches)) {
     
$X[$matches[1]]=$matches[2];
      }
   }
      
   
fclose($F);
   return 
$X;
}


function 
remove_progress_metter_file() {
   
$file get_progress_metter_file();
   if (!
$file) return;
   
unlink($file);
}

function 
get_progress_metter_file() {

   
$id $_GET["UPLOAD_METTER_ID"];
   
$dir ini_get('upload_metter_dir');

   if (!isset(
$id))  return FALSE;
   if (!isset(
$dir)) return FALSE;
   if (!
$dir) return FALSE;
   if (!
$id)  return FALSE;

//   if (preg_match('/[\'\"\`\/\\\?\*\&\^]|\.\./', $id)) {   ## cannot contain .. or '"`?*&^ or /-es or \-es
   
if (preg_match('/[\'\"\`]|\.\./'$id)) {   ## cannot contain .. or '"`?*&^ or /-es or \-es
      
return "";
   }else{
      return 
"$dir/$id";
   }
}

function 
nice_value($x) {
   if (
$x 100)  $x;
   if (
$x 10000)  return sprintf("%.2fKB"$x/1000);
   if (
$x 900000) return sprintf("%dKB"$x/1000);
   return 
sprintf("%.2fMB"$x/1000/1000);
}


$X read_progress_metter();
if (!
$X) {

echo (
'<HTML><BODY '. ($close_popup_window_when_done ' onLoad="window.close()"' ''). ' > Invalid metter ID!</BODY></HTML>');


}else{

   
$metter sprintf("%.2f"$X['bytes_uploaded'] / $X['bytes_total'] * 100);

   
$sp $X['speed_last'];
   if (
$sp 10000$speed  sprintf("%.2f"$sp 1000);
   else 
$speed  sprintf("%d"$sp 1000);

   
$eta sprintf("%02d:%02d"$X['eta'] / 60$X['eta'] % 60 );
   
   
$upl   nice_value($X['bytes_uploaded']);
   
$total nice_value($X['bytes_total']);
  
   if (
$X['bytes_total'] > && $X['bytes_uploaded'] >= $X['bytes_total'] && $X['eta'] == 0) {
      echo (
'<HTML><BODY '. ($close_popup_window_when_done ' onLoad="window.close()"' ''). ' > UPLOAD completed!</BODY></HTML>');
      
remove_progress_metter_file();   
   }else{

?>

<HTML>
<HEAD>

<meta HTTP-EQUIV="Refresh" CONTENT="1">

<TITLE>Uploading Files... Please wait ...</TITLE>

<style type='text/css'> td {font-size: 10pt } td.uplmtr {font-size:6pt; height:12px}</style>

</HEAD>
<BODY BGCOLOR="#C0C0C0">

Uploading files... 

<table border=1 WIDTH="100%" cellPadding=0 cellSpacing=0 style='BORDER-BOTTOM: 0px inset; BORDER-LEFT: 0px inset; BORDER-RIGHT: 0px inset; BORDER-TOP: 0px inset'> <tr><td>
  <table border=0 WIDTH="100%" COLS="34"><tr>

  <? 

     
for ($i=0$i<100$i+=3) {
    
$color = ($i<$metter) ? " bgcolor='#00007F' " '';
    
$width = ($i+3<100)   ? "3" 100-$i;
    echo(
"<td $color class='uplmtr' WIDTH='$width%'>&nbsp;</td>\n");
     }
  
?>

</tr></table>
</td></tr></table>

<TABLE WIDTH=100%><TR><TD>
<?=$eta?> left (at <?=$speed?>KB/sec) 
</TD><TD ALIGN=right>
<?=$upl?>/<?=$total?>(<?=$metter?>%)
</TD></TR><TR><TD>

</TD></TR></TABLE>

</BODY>
</HTML>

<?  } } ?>
Y aqui el formulario

Código PHP:
<? 


$id 
rand() . '.' time();

$upl ini_get('upload_metter');
$dir ini_get('upload_metter_dir');

?>



<HTML>
<HEAD>
<TITLE>Upload test </TITLE>
</HEAD>
<BODY>

generated new UPLOAD_METTER_ID = <?=$id?> <br>
php-config.upload_metter = <?=$upl?> <br>
php-config.upload_metter_dir = <?=$dir?> <br>

<P><FORM METHOD="POST"  ENCTYPE="multipart/form-data" 
onSubmit="window.open('progress.php?UPLOAD_METTER_ID=<?=$id?>','UploadMetter','width=370,height=115', true); return true; "
action="upload_done.php"
>

<input type=hidden name=UPLOAD_METTER_ID value="<?=$id?>">
Select File 1: <INPUT TYPE="file" NAME="filename1" VALUE=""><br>
Select File 2: <INPUT TYPE="file" NAME="filename2" VALUE=""><br>
Select File 3: <INPUT TYPE="file" NAME="filename3" VALUE=""><br>
Select File 4: <INPUT TYPE="file" NAME="filename4" VALUE=""><br>
Select File 5: <INPUT TYPE="file" NAME="filename5" VALUE=""><br>

<P><INPUT TYPE="submit">
</FORM>


<hr>
<a href="http://pdoru.from.ro/upload-progress-metter.v2.tgz">Download upload-progress-metter.v2.tgz</a>

</BODY></HTML>
Jeje pero para eso tendremos que esperar a PHP5 :P un saludillo!!!
__________________
Usuario registrado de Linux #288725
  #4 (permalink)  
Antiguo 07/01/2004, 07:10
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Jeje .. epplestun ... me va gustando PHP 5 xD.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 07/01/2004, 08:38
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 16 años, 1 mes
Puntos: 5
jeje tiene sus cosas buenas jeje y sus "malas" jeje pero bueno habra que saber convivir con ellas :D
__________________
Usuario registrado de Linux #288725
  #6 (permalink)  
Antiguo 07/01/2004, 19:38
wpp
 
Fecha de Ingreso: noviembre-2003
Mensajes: 50
Antigüedad: 14 años, 1 mes
Puntos: 0
Intento trabajar con el código pero me da problemas en línea 54 el arhivo upload.
A parte la ventana que dices que carga en popup, claro no me reconoce el destino y me dice no existe.
Ayuda a mi email: [email protected]
Gracias.
  #7 (permalink)  
Antiguo 08/01/2004, 07:27
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
wpp ....

Leistes bien que el código propuesto -sólo sirver- para PHP 5 ?¿

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 08/01/2004, 07:44
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

Si seguimos los links que pone en el codigo, vemos que en la pagina http://pdoru.from.ro/ explican que es un parche para PHP 4.x Es decir, debes recompilar PHP para poder usarlo. Y añadir un par de directivas al php.ini.

No se si en PHP 5 ya han incluido ese parche (por lo que dice epplestun deduzco que si) en el codigo principal.

Saludos.

PD: Que quebraderos de cabeza da el eyecandy
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #9 (permalink)  
Antiguo 08/01/2004, 09:11
wpp
 
Fecha de Ingreso: noviembre-2003
Mensajes: 50
Antigüedad: 14 años, 1 mes
Puntos: 0
Ayuda sobre el tema...

Lo he probado ahora de nuevo y me funciona correcto, o por lo menos no me da errores, lo que pasa es que la ventana popup se esconde enseguida a pesar de seguir subiendo el archivo, en algunas ocasiones pone idmeter no valida. Luego a pesar de poner que el archivo se ha subido correctamente, refresco el servidor y en cambio no ha subido nada.
Gracias por la ayuda.
email: [email protected]
  #10 (permalink)  
Antiguo 08/01/2004, 09:32
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
wpp ..

Insisto una vez más que leas con detenimiento los mensajes de este tema .. que no solo te "ciegues" con el código y leas atentamente que:

1) Ese código sólo funciona bajo PHP versión 5
2) O PHP 4.x pero con modificaciones que debes compilar PHP para poder usarlo (según dicen en el link indicado)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #11 (permalink)  
Antiguo 08/01/2004, 12:26
wpp
 
Fecha de Ingreso: noviembre-2003
Mensajes: 50
Antigüedad: 14 años, 1 mes
Puntos: 0
perdonar una vez más mi ignorancia

Es que no se como se modifica php a versión 5, yo únicamente subo el código que me indicais al servidor remoto linux que tengo y autorizo todos los permisos 777 y no me va.
Podríais explicar mejor eso de modificar a 5.
Gracias y perdon moderador por repetir antes el mensaje, lo hice por desconocimiento de las normas.
  #12 (permalink)  
Antiguo 08/01/2004, 12:38
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pero .. hombre .. esto no es llegar y hacer un "cut-and-paste" .. Se te está diciendo constantemente que ese código requiere de configuración y COMPILACIÓN de PHP/Apache.

Tu tienes acceso total a ese servidor como para compilar denuevo PHP? ..

Si lo tienes . ahí tienes toda la documentación completa:
http://pdoru.from.ro/

Pero, un consejo: .. Si apenas sabes ni que versión de PHP usas .. Olvidate de ese còdigo y busca otras alternativas.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 08/01/2004, 12:51
wpp
 
Fecha de Ingreso: noviembre-2003
Mensajes: 50
Antigüedad: 14 años, 1 mes
Puntos: 0
Lamento no alcanzar vuestro nivel de conocimientos.

Pero gracias por todo, buscaré en otro sitio, otro código que sea útil para analfabetos como yo.
Suerte.
  #14 (permalink)  
Antiguo 08/01/2004, 12:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
wpp .. no es cosa de "analfabetos" o no ..

El caso es que PHP por "defecto" no gestiona ese dato que informa al servidor de cuanto lleva del proceso de Upload .. Según comentó epplestun .. en PHP 5 estará disponible esa gestión de Upload mejorado que lo que incorpora PHP 4.x.

Y .. como se explica en ese link que te dejé en su documentación .. dice (es necesario) entrar a compilar PHP 4 (que uses) para aportar esa funcionalidad que por defecto PHP 4 no incorpora y que PHP 5 si que la incorporará.

Yo te dí en mi primer mensaje una "teoría" sobre una alternativa factible de implementar usando en gran parte Javascritp. Tal vez la encuentres ya implementada en sitios como www.hotscripts.com .. o en www.phpclasses.org

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #15 (permalink)  
Antiguo 08/01/2004, 14:57
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Veamos, tal como funciona PHP actualmente, el codigo del script destino no empieza a ejecutarse hasta que ya se ha grabado el fichero al disco. Es decir, no puedes ejecutar ningun codigo tuyo entre el momento en que el navegador empieza a enviar el fichero y el momento en que acaba PHP de grabar en disco el fichero. Asi que no hay forma real de poner el indicador de progreso.

El codigo que puso epplestun es para el caso en que PHP este compilado con una modificacion que permite a PHP mandar informacion sobre el estado del upload. Pero no es lo normal tener configurado asi PHP.

Asi que la unica solucion es la que te comento Cluster: abrir un popup en el submit del form con una animacion (o un texto), y cerrar ese popup desde el script destino del form, una vez subido y procesado el fichero.

Suerte.

PD: Tambien me suena que habia algun uploadmeter en PERL que implicaba cambiar la configuracion de apache.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #16 (permalink)  
Antiguo 08/01/2004, 15:09
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Parece que a lo que hace referencia josemi es:

http://sourceforge.net/projects/megaupload/

Pero OJO .. requiere de Perl ademas de PHP. Tal vez sea más factible una solución así que no andar recompilando PHP .. Si es que dispones de Perl en tu servidor.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 22:45.