Foros del Web » Programando para Internet » PHP »

Mostrar Mensaje mientras subo Archivo

Estas en el tema de Mostrar Mensaje mientras subo Archivo en el foro de PHP en Foros del Web. Que tal masters, Tengo algo que parece sencillo de resolver pero no lo he logrado. Desde una página selecciono un archivo y un nombre standard, ...
  #1 (permalink)  
Antiguo 07/12/2006, 16:44
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Mostrar Mensaje mientras subo Archivo

Que tal masters,

Tengo algo que parece sencillo de resolver pero no lo he logrado.

Desde una página selecciono un archivo y un nombre standard, se abre una nueva ventana a la que se le envía todo por POST y es la que sube el archivo y registra la subida en la Base de datos.

Todo me funciona a la perfección. Lo que suscede es que la pagina que sube los archivos, no tiene nada de HTML y le coloqué un gráfico para que mostrara en los segundos ue demora la subida del archivo para que no se vea en blanco absoluto, pero no me muestra el gráfico.

He leido sobre esto y es algo que hay que hacer con buferes de salida para que se muestre algo mientras php hace un proceso, etc, he probado varias cosas pero la verdad no lo logro es tan simple como poder mostrar un mensaje de "subiendo" mientras la página hace el proceso.


Se podrás solucionar esto con algo como :
Código PHP:
ob_start(); 
echo 
"Loading.................";
ob_end_clean(); 
La cuestión es que no se si es así exactamente y no se donde colocarlo.


Este es el form que envía lo que se va a subir :

Código PHP:
<form action="new_claim_file.php"
method="post" enctype="multipart/form-data" name="form2" target="New Claim File"
id="form2" onsubmit="estado=verificarFormu(this);if(estado==true) 
window.open('new_provider_file.php', 'New Claim File'); return estado"

Y este es el code que sube el archivo y registra en la Base de Datos :

Código PHP:
<?
$standard
=$_POST['standard_name*'];
$c_id=$_POST['claim_id'];
//Buscamos si el caso tiene archivos con ese standard name y seleccionamos el más reciente -El de mayor ID-
mysql_select_db($database_domain$domain);
$result3 mysql_db_query("domain","SELECT name from claim_file WHERE claim_id='$c_id' AND claim_file_id IN (SELECT Max(claim_file_id) from claim_file WHERE name like'$standard%')");
while(
$row mysql_fetch_array($result3)) 

$last_name=$row["name"];
}
echo 
$last_name;

$array_name explode("-"$last_name);
//Tomamos el nombre antes del -
$name_last_name=$array_name[0];

//Tomamos el valor del consecutivo y lo aumentamos en 1
$consec=$array_name[1]+1;

//Armamos el nuevo standard_name completo (sin extensión) para el nuevo archivo
$new_name=$standard."-".$consec;

//Hacemos la busqueda del country del proveedor para construir la ruta de subida de los archivos
mysql_select_db($database_domain$domain);
$result2 mysql_db_query("domain","SELECT provider_id, country, company_name, provider_id FROM provider WHERE company_name='".$_POST['provider']."'");
while(
$row mysql_fetch_array($result2)) 
{
$claim_id=$_POST['claim_id'];
$country=$row["country"];
$company_name=$_POST['provider'];

//Inicializamos la variable $file_name
$file_name="";
//Le asignamos el valor que recibimos del form

$file_name=$_FILES['input_file*']['name'];

//Tomamos el nombre del archivo
$name=$new_name;

//Tomamos la extensión del archivo
$extension=substr($file_namestrlen($file_name)- 3);
$namec=$new_name.".".$extension;
//Construimos la ruta a la que se subirá el archivo
$path="../../files/domain/$country/Providers/$company_name/Claims/$claim_id/";

//Tomamos valores para insertar en la BD los datos del file
$upload_date date("Y/m/d"); 
$upoload_hour_2 =date("H:i:s"); 
$file_size round$_FILES['input_file*']['size'] / 10242);
$uploaded_by=$_SESSION['usuario_name'];

//Mensaje en caso de que no se suba el archivo correctamente
if (!copy($HTTP_POST_FILES['input_file*']['tmp_name'],$path.$namec)){
   
$subido="yes";
   echo 
"Failed to copy $file_name...\n";
   }

//Si el archivos se sube correctamente insertamos los datos del archivo en la BD
if ($subido!="yes")
{
$insercion=mysql_db_query ("domain","INSERT INTO claim_file (claim_id, path, file_name, 
upload_date, upload_hour, file_size, uploaded_by, name, extension)
VALUES
('$claim_id','$path','$namec','$upload_date', '$upoload_hour_2', '$file_size','$uploaded_by', '$name', '$extension')"
); 

//Cerramos la ventana y refrescamos la ventana padre
echo "<script>window.opener.location.reload(); window.close();</script>";exit;
}
?>
__________________
EL LIMITE ES EL UNIVERSO
  #2 (permalink)  
Antiguo 07/12/2006, 17:34
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
Re: Mostrar Mensaje mientras subo Archivo

El código que presentas del mensaje con el control del buffer de PHP (con el ob_start() y demás) .. lo debes usar en el script de proceso PHP, en el que envias tu formulario HTML y campo "file" ..

Pero, realmente así no vas a conseguir el efecto deseado. PHP no "suelta" el proceso hasta que termina .. es decir, hasta que no subió todo el archivo no se continua el proceso de PHP .. PHP no controla datos en modo "raw" como hacen otros lenguajes (Perl por ejemplo .. por lo menos que yo sepa, .. habría que ver si PHP 5 por ejemplo ya hace algo al respecto). Por ende .. "pierdes" el control por el tiempo que tarda en subir tu archivo al servidor.

Una solución simple es abrir un "popup" (en javacript .. una ventana) al hacer tu "submit" de tu formulario HTML, .. igual notras esa "página en blanco" y hasta el "foco" podrías perder en el tiempo que dure el "upload" .. todo eso tendrás que manejarlo con javascript.

Al terminar el "uploda" podrías usar como "fin" de ese proceso PHP el generar HTML que llame a tu rutina javascript de "window.paranet.close()" o algo similar (mi fuerte no es javascript) para cerrar tu ventana al terminar el proceso. Con este proceder también hay que tener cuidado, .. si dejas el proceso en el script que lo hace .. si "recargas" esa página se repetirá el proceso nuevamente, siempre hay que intentar "salir" del proceso redireccionando a otra página para evitar este tipo de problemas.

Tal vez con técnicas de "Ajax" quede mejor este proceso.

Ejemplos:
http://bluga.net/projects/uploadProgressMeter/
http://pdoru.from.ro/
(Fijate que habla de "parchear" PHP .. justamente para aportar la lectura de datos "RAW" a PHP que por defecno no soporta).

Otros ejemplos:
http://www.devpro.it/upload_progress/
http://www.captain.at/ajax-file-upload.php
http://www.dinke.net/blog/2006/11/04...ress-meter/en/
http://www.sibsoft.net/xupload.html

En realidad hay muchas opciones, ..algunas pasan por Perl, otras integran Ajax .. otras tantas "parchean" a PHP (con alguna extensión o recompilar PHP) .. Las más precisas por supuesto son las que "parchean" PHP .. pues realmente "miden" el progreso .. las otras opciones (sólo "ajax" por ejemplo) no.

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/12/2006, 18:12
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 22 años, 4 meses
Puntos: 4
Re: Mostrar Mensaje mientras subo Archivo

Gracias Cluster,

La verdad no pensé que fuera algo que estuviera tan al límite del lenguaje. Es decir, pensé que de alguna forma se podría enviar html o algo antes.

Evaluaré las soluciones. Gracias por la ayuda. Saludos.
__________________
EL LIMITE ES EL UNIVERSO
  #4 (permalink)  
Antiguo 07/12/2006, 18:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
Re: Mostrar Mensaje mientras subo Archivo

Cita:
Iniciado por jpogsistem Ver Mensaje
Gracias Cluster,

La verdad no pensé que fuera algo que estuviera tan al límite del lenguaje. Es decir, pensé que de alguna forma se podría enviar html o algo antes.

Evaluaré las soluciones. Gracias por la ayuda. Saludos.
mm Bueno . .fijate que PHP es un lenguaje del "lado del servidor" .. y en como funciona esta filosofía de desarrollo donde lo principal es que el "servidor" genere la página o reciba los datos lo antes posible .. pero no hay "iteracción" con el cliente en principio .. por eso esa "ida y venida" de datos que informar al "cliente" desde el "servidor" para mostrar esos "progresos" de un proceso que está sucediendo entre ambos es lo complicado ... Por suerte, técnicas como "ajax" te ayudan .. también otros lenguajes como Perl o modificar "PHP" para que pueda tener el control de datos en forma "RAW" mientras se van procesando.

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




La zona horaria es GMT -6. Ahora son las 23:07.