Foros del Web » Programando para Internet » PHP »

Sistema de descargas bloquea navegacion

Estas en el tema de Sistema de descargas bloquea navegacion en el foro de PHP en Foros del Web. Hola a todos, Tengo implementado un sistema de descarga de ficheros de tal forma que al pulsar en un link del tipo http://misitio.com/descarga.php?id=24 empieza la ...
  #1 (permalink)  
Antiguo 12/04/2004, 09:45
jcorba
Invitado
 
Mensajes: n/a
Puntos:
Sistema de descargas bloquea navegacion

Hola a todos,

Tengo implementado un sistema de descarga de ficheros de tal forma que al pulsar en un link del tipo http://misitio.com/descarga.php?id=24 empieza la descarga del fichero correspondiente.
El fichero.php toma la varaible id, obtiene el path correspondiente para el id pasado, manda unas cuantas cabeceras con la función header y posteriormente empieza el envío del fichero desde el servidor al cliente con la función @readfile().
Las descargas que estoy realizando son bastante grandecitas y varian entre un mega y 100 Mb.

Pues bien, el problema que tengo es que mientras no termina la descarga del fichero que hemos solicitado no puedo seguir navegando por el sitio web...digamos que es como si los links dejasen de funcionar. Una vez la descaga ha sido completada, ya se puede volver a navegar por la web...los links vuelven a funcionar.

Alguna idea de como arreglar esta cosita tan fea??
  #2 (permalink)  
Antiguo 12/04/2004, 10:09
Avatar de jnegro  
Fecha de Ingreso: diciembre-2001
Ubicación: Salta
Mensajes: 238
Antigüedad: 18 años, 1 mes
Puntos: 0
usando el Target="_blank" en el enlace no te bloquearía una nueva ventana?( inexistente)
__________________
Julio
Clasificados Gratis
  #3 (permalink)  
Antiguo 12/04/2004, 10:20
jcorba
Invitado
 
Mensajes: n/a
Puntos:
He usado el target _blank y funciona, pero el problema que tengo es que despues de terminar la descarga del fichero la nueva ventana no se cierra....es curioso pero al pinchar en un link del tipo <a href="/download.php?id=1" target="_blank">, se abre una nueva ventana en blanco y luego aparece el cuadro de dialogo de descarga del navegador, y durante todo el proceso de descarga dicha ventana sigue viva, y una vez terminado el proceso, dicha ventana no se cierra.
  #4 (permalink)  
Antiguo 12/04/2004, 10:30
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 18 años
Puntos: 129
Usa un redireccionamiento automático al terminar el proceso de Upload ..

<?
// proceso de upload con el move_uploaded_file() o copy() ...

header ("location: pagina.tal");
exit;
?>

o bien si abres esa descarga en una página nueva por un "pop up" .. usa javacript para cerrar la ventana en ese punto (window.close ..)

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 12/04/2004, 10:36
Avatar de jnegro  
Fecha de Ingreso: diciembre-2001
Ubicación: Salta
Mensajes: 238
Antigüedad: 18 años, 1 mes
Puntos: 0
se me ocurre en la página download.php hacer una redirección al final del código a una página que se autocierre tipo >body onload="close()">
entonces se cerraría al terminar la descarga
__________________
Julio
Clasificados Gratis
  #6 (permalink)  
Antiguo 12/04/2004, 10:59
jcorba
Invitado
 
Mensajes: n/a
Puntos:
Hola,

Antes he puesto que si utilizo target blank funciona...pues me he equivocado.
Tengo tengo el php en safe_mode=on e intento navegar mientras estoy descargando, en el log del php me aparece lo sigueinte:
[12-Apr-2004 17:19:19] PHP Fatal error: Maximum execution time of 30 seconds exceeded in c:\webserver\download.php on line 83
La línea 83 es la siguiente al readfile().
Si tengo el php en safe_mode=off dicho error no es reportado en el log del php cuando intento navegar, pero no se carga el contenido de las paginas, apareciendo la pagina de error: No se encuentra el archivo...el cual existe ya que despues de terminar la descarga doy a recargar y funciona sin problemas.


Por otra parte, he probado lo que me habeis comentado de poner un header("Location: http://" . $_SERVER['HTTP_HOST']. "/fin.htm"); despues del readfile y que fin.htm tenga en el body un onload=close(), pero no funciona apareciendo lo siguiente en el log del php:
[12-Apr-2004 17:46:50] PHP Warning: Cannot modify header information - headers already sent by (output started at c:\webserver\download.php:58) in c:\webserver\download.php on line 99
Deduzco que no deja hacer un header despues de un readfile

No se por donde puedo seguir buscando

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1252"></HEAD>
<BODY></BODY></HTML>
  #7 (permalink)  
Antiguo 12/04/2004, 11:00
jcorba
Invitado
 
Mensajes: n/a
Puntos:
al final de mi ultimo post esta puesto el siguietne codigo, el cual corresponde al codigo fuente de la ´pagina nueva que se abre al poner el link con el target blank:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1252"></HEAD>
<BODY></BODY></HTML>



Un saludo
  #8 (permalink)  
Antiguo 12/04/2004, 14:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 18 años
Puntos: 129
Aumenta el tiempo máximo de ejecución de ese script en concreto o de los que requieran más tiempo de ejecución con:

set_time_limit(segundos)

Así ya deberías estar viendo los errores sobre el tamaño máximo del archivo que subes y los de memoria ..

Cita:
12-Apr-2004 17:46:50] PHP Warning: Cannot modify header information - headers already sent by (output started at c:\webserver\download.php:58) in c:\webserver\download.php on line 99
Deduzco que no deja hacer un header despues de un readfile
Así es .. el readfile() lee el archivo y lo entrega al buffer de salida de PHP y .. eso probaca esos envios de cabeceras HTTP y el error en header() ..

(por mi parte me confundí en el proceso .. creia que era en el "Upload" y es en la descarga)

Un saludo,



Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 12/04/2004, 17:08
jcorba
Invitado
 
Mensajes: n/a
Puntos:
Hola Cluster,

Hay un problema con el set_time_limit, ya que con el safe_mode activado (mi caso) esta función está deshabilitada.

Por otra parte tengo me surge una duda: mi problema de los 30 segundos donde se da en el tiempo que tarda el servidor en porcesar el archivo de 100 Mb o en el tiempo que tarda el cliente en obtener toda la salida que produce el readfile, ya que si es en el último caso esto dependerá no solo del tamaño del fichero (como en el primer caso) sino que tambien dependará de la velocidad de la conexión que tenga el cliente.

Un saludo
  #10 (permalink)  
Antiguo 12/04/2004, 17:14
jcorba
Invitado
 
Mensajes: n/a
Puntos:
Hola,

acabo de ver que en uno de mis post anteriores he alterado lo que me sucede segun si tengo safe_mode en off o en on. Para lo pongo corregido:


Si pongo en el php.ini safe_mode=off e intento navegar mientras estoy descargando, en el log del php me aparece lo sigueinte:
[12-Apr-2004 17:19:19] PHP Fatal error: Maximum execution time of 30 seconds exceeded in c:\webserver\download.php on line 83
La línea 83 es la siguiente al readfile().
Si tengo el php en safe_mode=on dicho error no es reportado en el log del php cuando intento navegar, pero no se carga el contenido de las paginas, apareciendo la pagina de error: No se encuentra el archivo...el cual existe ya que despues de terminar la descarga doy a recargar y funciona sin problemas


En mi caso tengo que dejar el servidor con safe_mode=on por otra serie de cosas.

Un saludo y perdon por la confusion
  #11 (permalink)  
Antiguo 13/04/2004, 14:14
jcorba
Invitado
 
Mensajes: n/a
Puntos:
Hola,

Voy a resumir la situación actual, ya que despues de hacer tantos intentos he reportado cosas falsas:

El php lo tengo configurado en modo seguro (safe_mode=on), por tanto no puedo usar la función set_time_limit(0) ya que esta queda desactivaba en el modo seguro.

Al cabo de 30 segundos (ya que en el php.ini tengo max_execution_time=30) e independientemente de si esta o no activado el modo seguro, se crea el "Fatal Error" el cual es reportado en el log del php si pongo readfile($mifichero) y en el caso de que ponga @readfile($mifichero) el error no es reportado en el log del php.

Independientemente que de si readfile ha sido invocado con la arroba o sin ella, las siguientes líneas del script no se ejecutan (las cuales me interesan que se sigan ejecutando ya que llego una serie de contadores).

Por tanto los problemas que finalmente tengo son dos:
-Si la descarga del fichero dura ms de 30 segundos, el fichero es obtenido correctamente por el usuario, pero al no seguir ejecutandose el script no se me actualizan ciertos contadores.

-El usuario cuando pincha en un link del tipo http://server/descarga.php?id=2 le sale el cuado típico de descarga de abrir/guardar/cancelar. Si acepta la descarga, empieza la misma pero la ventana desde la cual pincho en el link queda innavegable hasta que no acaba la descarga....esto es solucionable???

Un saludo,
PD: Perdon por el caos de los post anteriores pero con tantas pruebas me perdí un poco
  #12 (permalink)  
Antiguo 13/04/2004, 16:33
jcorba
Invitado
 
Mensajes: n/a
Puntos:
Hola a todos,

He estado mirando en webs que tienen implementados motores de descarga y que el problema en que el navegar se quede bloqueado durante la descarga pueda ser por el tipo de cabeceras que estoy mandando.
He estado mirando el motor de descargas que hay implementado en http://www.desarrolloweb.com/descarg...hp?descarga=87 y resulta que cuando pulsas en el link de descarga la ventana que aparece con los botones abrir/guardar/cancelar no es modal (es decir se puede seguir interactuando con la ventana que produjo el evento) en cambio en mi sitio web esto no sucede.
Lo estoy probando con IE 6.0 SP1... mañana lo pruebo con mozilla/netscape para ver si el efecto es el mismo o difiere.

El codigo que tengo implementado es el siguiente:

$filename=basename($fichero);
$filesize = filesize($fichero);

// 'application/octet-stream' is the registered IANA type but
// MSIE and Opera seems to prefer 'application/octetstream'
$USR_BROWSER_AGENT="";
if (preg_match('@Opera(/| )([0-9].[0-9]{1,2})@', $_SERVER['HTTP_USER_AGENT'])) $USR_BROWSER_AGENT='OPERA';
if (preg_match('@MSIE ([0-9].[0-9]{1,2})@', $_SERVER['HTTP_USER_AGENT'])) $USR_BROWSER_AGENT='IE';
$mime_type = ($USR_BROWSER_AGENT == 'IE' || $USR_BROWSER_AGENT == 'OPERA')
? 'application/octetstream'
: 'application/octet-stream';
header('Content-Type: ' . $mime_type);
// Se informa al navegador del tamaño del fichero y puede mostrar la barra de progreso de descarga
header('Content-Length: ' . filesize($fichero));
header('Content-Transfer-Encoding: binary');
header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
// IE need specific headers
if ($USR_BROWSER_AGENT == 'IE')
{
//header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
}
else
{
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Pragma: no-cache');
}
@readfile ($fichero);

Alguna idea al respecto???
  #13 (permalink)  
Antiguo 02/12/2009, 04:18
Avatar de cubic  
Fecha de Ingreso: febrero-2007
Mensajes: 51
Antigüedad: 12 años, 11 meses
Puntos: 1
Respuesta: Sistema de descargas bloquea navegacion

A mi con Firefox me funciona se me abre i cierra la pagina del blank i me sale el dialogo de guardar archivo.
En cambio con IE ni se me abre el blank ni me pide descarga.

Lo he hecho según pone en la web de PHP y tampoco:
php.net/manual/en/function.readfile.php
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 00:06.