Foros del Web » Programando para Internet » PHP »

Subir archivos fuera del sitio web y otros problemas

Estas en el tema de Subir archivos fuera del sitio web y otros problemas en el foro de PHP en Foros del Web. Hola he hecho una web para un grupo de música, y tiene una herramienta para poder subir archivos de audio y que en la web ...
  #1 (permalink)  
Antiguo 25/04/2006, 12:39
 
Fecha de Ingreso: agosto-2003
Ubicación: Málaga, España
Mensajes: 407
Antigüedad: 14 años, 4 meses
Puntos: 1
Subir archivos fuera del sitio web y otros problemas

Hola he hecho una web para un grupo de música, y tiene una herramienta para poder subir archivos de audio y que en la web la gente puede descargarlos. Me he encontrado con un par de problemas que no sé solucionar:
(Trabajo con PHP bajo windows 2000 server)

Problema 1. A la hora de descargar los arhivos en principio todo va bien, pero el archivo no lo descarga entero... y me he dado cuenta que al final (he leido con el notepad el archivo.mp3) veo que ha añadido este error:

"<head><title>Aplicación CGI caducada</title></head>
<body><h1>Caducidad CGI</h1>La aplicación CGI especificada ha excedido el tiempo permitido para procesamiento. El servidor ha eliminado el proceso."

Y este es el código que uso para arrancar la descarga en un script php (sacado de un post de este foro) :

$file=$RutaDescarga;
header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename=' . basename($file));
readfile($file);

Como ya sabrán es para evitar que el reproductor de audio lo abra y se inicie la descarga.

Problema 2. Me gustaría tener los archivos q se suben / descargan en un directorio fuera del sitio web, aunque sea otro sitio web creado aparte, pero no he sido capaz de hacer que funcione la subida de archivos, supongo que no es capaz de resolver la ruta destino el 'move_uploaded_file'. Esto no es por seguridad, ni para que la gente no acceda a los archivos, sino para poder tener a parte el código PHP (que tengo que bajarme constantemente del servidor) de los archivos de audio.

¿Puede alguien echarme una mano?
Gracias!
  #2 (permalink)  
Antiguo 25/04/2006, 15:12
Avatar de eft0  
Fecha de Ingreso: junio-2003
Ubicación: Santiago - Chile
Mensajes: 635
Antigüedad: 14 años, 6 meses
Puntos: 8
Claramente es el timeout del archivo, dale al archivo de descarga esto:

set_time_limit(0);

Ve como te va. En cuanto a la segunda parte deberias dejar un poco mas claro, es decir, tu estructura actual es asi:

/
- index.php
- descarga.php
- achivo1.mp3
- achivo2.mp3
- achivo3.mp3


Correcto? Y lo quieres dejar dentro de un subdirectorio, o dentro de otro servidor web ?
  #3 (permalink)  
Antiguo 26/04/2006, 04:01
 
Fecha de Ingreso: agosto-2003
Ubicación: Málaga, España
Mensajes: 407
Antigüedad: 14 años, 4 meses
Puntos: 1
Muchas gracias por tu atención eft0
Te comento:

1. Sobre la descarga:
Parece que sigue sin funcionar...
Para descargar llamo a un archivo descarga.php que contiene este código

set_time_limit(0); // -----> Añadido desde tu respuesta
header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename=' . basename($file));
readfile($file);

Y sigue el error el mismo, en los archivos 'grandes' da un error de caducidad CGI (que añade al contenido del archivo!!!!) y no termina de bajarse.
Incluso en los que da tiempo a descargar añade siempre un '</body></html>' y que yo sepa, no hay código php que muestre nada después, de todas formas he incluido un 'die()' justo después de llamar a descargar.php y parece que ya no sale:

include(descarga.php);
die();

¿Raro verdad? ¿qué puedo hacer?

2. Sobre la subida. Esta es la estructura de directorios que quiero conseguir
Por cierto, ¿conviene que ponga también 'set_time_limit(0);' en la subida de archivos?

Raiz/SitioWeb1/ArchivosSubidos/
Raiz/SitioWeb2/PHPScripts/

-Raiz es de donde cualgan todos los directorios que contienen un servicio web en el servidor
-SitioWeb1, donde quiero almacenar la subida de archivos (a SitioWeb le he creado también un servicio web)
-SitioWeb2, donde están todos los scripts php de la página

Así es como quiero trabajar, de momento está bajo un directorio apuntado por un servicio web.

Gracias por tu ayuda y a ver si podemos solucionarlo!
  #4 (permalink)  
Antiguo 26/04/2006, 08:40
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En cuanto a problemas de "time out" .. tu servidor HTTP (cual usas? .. IIS, Apache? ...) también puede imponer restricciones de tiempo de ejecución de tus scritps .. y no dependerá de PHP sino de quien lo controla: tu servidor HTTP. Indica cual usas para ver si hay directiva que gestione ese tema que debas ajustar.

Cita:
Incluso en los que da tiempo a descargar añade siempre un '</body></html>' y que yo sepa, no hay código php que muestre nada después,
En general .. tanto tu servidor HTTP como PHP a la hora de presentar mensajes de error lo hace "formateando" su salida con HTML (sobre todo pasa en PHP si usas "display_errors = ON" .. Pero lo dicho .. no es sólo PHP quien hace ese tipo de cosas, lo hace también tu servidor HTTP.

Cita:
Por cierto, ¿conviene que ponga también 'set_time_limit(0);' en la subida de archivos?
Si, .. PHP al subir un archivo pasa todo el proceso como ejecución del script en total (tiempo de proceso PHP + el del "upload" en sí). Tambien recuerda que PHP tiene limites de que tanta memoria puede asignar para la ejecución de un script (ver php.ini) .. y ese "total" es considerado incluyendo el tamaño del archivo que subas.

Cita:
Así es como quiero trabajar, de momento está bajo un directorio apuntado por un servicio web.
No entiendo que es lo que llamas "servicio web" (será un "Servidor Virtual"? ...) .. Bueno .. el caso es que tu archivo a descargar que hace un "readfile()" ha de apuntar al archivo por su ruta absoluta completa. Supongo que $file .. la incluye: /var/www/SitioWeb1/ArchivosSubidos/ .. o c:/www/SitioWeb1/ArchivosSubidos/ .. o como corresponda. Como veras me refiero a "ruta absoluta" del servidor .. no al "raiz" "virtual" de tu "servicio web?" ..

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 27/04/2006, 02:54
 
Fecha de Ingreso: agosto-2003
Ubicación: Málaga, España
Mensajes: 407
Antigüedad: 14 años, 4 meses
Puntos: 1
Hola Cluster ¿qué tal? gracias por echarme otro cable.
Te comento:
Uso el IIS que viene de serie con el win2000 server.
En él tengo configurado 'Tiempo de espera de la conexión' : 90.000 segundos.
En el php.ini tengo:
post_max_size = 40M (de sobra para lo que necesito)
max_execution_time = 300
max_input_time = 300
memory_limit = 128M
Y como ves el 'set_time_limit(0);' en los scripts de subida y descarga

Sobre el </body></html> añadido es muy estraño porque lo añade (dentro y al final de cada archivo.mp3) si quito el die(); que tengo justo detrás de llamar al descarga.php y no hay nada en la ejecución que muestre esos tags.

Sobre el servicio web, Sí, por servicio web llamo a un servidor virtual. Esto parece que finalmente he conseguido que funcione, de esta manera con dos servidores virtuales apuntando respectivamente a:
sitioweb1/ (aquí los archivos a subir y descargar)
sitioweb2/scripts/
Y con variables de ruta definidias en 'scripts' para acceder a los archivos:
$ruta = "./sitioweb1"; // para acceder a las descargas por http.
$rutafisica = "../../sitioweb1"; // para acceder fisicamente (descargas y borrar archivos)

(Pero como ves no uso ruta absoluta física y creo que así el código es más portable)

Un saludo.
  #6 (permalink)  
Antiguo 27/04/2006, 08:38
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
El tema de ese "HTML" que ves de más .. en PHP por ejemplo hay directivas como:
Cita:
; String to output before an error message.
;error_prepend_string = "<font color=ff0000>"

; String to output after an error message.
;error_append_string = "</font>"
Realmente no ví más mi php.ini .. Pero que "formatea" en HTML el mensaje de erro si lo hay PHP .. lo hace (y/o por alguna directiva más se puede desactivar como ya te comenté).

Ahora, .. no sé si IIS también hace lo suyo (no lo he usando nunca y menos configurado).

Consejo:
¿Por qué no usas Apache como servidor HTTP? .. Se que IIS ya lo tienes instalado .. pero realmente Apache bajo mi punto de vista es mejor para correr PHP .. si no hay otro impedimiento (por ejemplo que tengas que correr aplicaciones en ASP) deberías replantearte usar otro servidor HTTP en lugar de IIS.

Cita:
(Pero como ves no uso ruta absoluta física y creo que así el código es más portable)
Si tienes esa estructura física de directorios y donde "portes" esa aplicación (a otro servidor) la respetas .. OK .. usa rutas relativas (../../). De todas formas el tema de una ruta absoluta no es que tengas que "poner" a mano tu ruta absoluta. En PHP tienes variables de servidor (accesibles por $_SERVER array) que te entregan esa información ..

Por ejemplo:
$_SERVER['DOCUMENT_ROOT'] ..

Y también hay constantes.

http://www.php.net/reserved.variables



Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 27/04/2006, 13:20
 
Fecha de Ingreso: agosto-2003
Ubicación: Málaga, España
Mensajes: 407
Antigüedad: 14 años, 4 meses
Puntos: 1
Pues siempre he trabajado bajo windows y con IIE (cosas de donde he estado trabajando) Ahora cambiar esto en servidor... puede ser un poco complicado.

El caso es que sigue el tema del error de caducidad CGI y ya no sé que mirar.
Esto es todo lo que añade al archivo que se está descargando (además de cortar la descarga)

<head><title>Aplicación CGI caducada</title></head>
<body><h1>Caducidad CGI</h1>La aplicación CGI especificada ha excedido el tiempo permitido para procesamiento. El servidor ha eliminado el proceso.</body></html>

Saludos.
  #8 (permalink)  
Antiguo 28/04/2006, 07:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No conozco ese tipo de error (ni identifico si es de IIS (configuración) o de PHP (configuración)). Intenta meter ese mensaje de error en google, suele dar buenos resultados.

Revisa si IIS impone algún tipo de restricción a tiempo de ejecución de tus scripts (por que a los scripts PHP los trata según parece como un CGI y tiempo tipo "timeout" tienen o se les dá). También revisa en IIS si tienes limites de los datos que puede procesar/aceptar (realmente desconozco todo sobre IIS, pero tienes un foro de "Servidores web -> IIS" para confirmar estos detalles).

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 28/04/2006, 07:18
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Usé google como te comenté .. por el término "CGI timeout" .. y salió por ejemplo este comentario o FAQ de M$:

http://www.microsoft.com/technet/com.../iisi0302.mspx
(fijate en la última)

Dice que por defecto en IIS tus scripts CGI (parece que instalastes PHP como CGI? no como "múdulo" (ISAPI creo que le llama en IIS)) dice que son 300 segundos (5 minutos) lo que se le dá de tiempo a un script para su ejecución (pero igualmente revisa ese valor) .. Lo más probable es que el tiempo de subida de tu archivo o proceso exeda ese tiempo (por eso te funciona con archivos pequeños).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 28/04/2006, 09:29
 
Fecha de Ingreso: agosto-2003
Ubicación: Málaga, España
Mensajes: 407
Antigüedad: 14 años, 4 meses
Puntos: 1
Hola de nuevo. Instalé PHP (4.3.10) de una versión con 'instalador' para windows no sé si está como CGI o como ISAPI, ni si es mejor de una manera u otra....

La verdad que estuve mirando tanto en google como en las propiedades para configurar el server web, pero esa opción del tiempo CGI sólo aparece en el nodo principal que muestra la ventanita de los servicios web y en un subapartado (muy escondido) así que no sé si lo hubiera encontrado si no me echas este cable. Ya lo he cambiado a (30 minutos) a ver si ahora da tiempo con las subidas y bajadas de archivos.

Un saludo y muchas gracias otra vez por tu ayuda!
  #11 (permalink)  
Antiguo 28/04/2006, 11:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Hola de nuevo. Instalé PHP (4.3.10) de una versión con 'instalador' para windows no sé si está como CGI o como ISAPI, ni si es mejor de una manera u otra....

Lo puedes comprobar haciendo un phpinfo() .. ahí veras un bloque de información (en el primer recuadro) que dice "Server API" .. Normalmente la versión "instaler" deja a PHP como "CGI" (con todas sus ventajas y problemas). Intenta instalar PHP sobre IIS en modo ISAPI .. ganaras en redimiento sobre todo.

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 (incluyéndote)




La zona horaria es GMT -6. Ahora son las 12:37.