FAQ
Hola a todos,

Llevo un rato revisando el manual y diferentes foros de programación
por un problema con el File Upload en PHP con ficheros grandes. El
tema es que intento mandar vía web ficheros que pueden llegar a 5 Mb
de peso.

En el formulario HTML he puesto el campo MAX_FILE_SIZE en 6200000
(para curarme en salud) y he visto que hay dos directivas en PHP que
afectan, que son upload_max_filesize y post_max_size. Los valores
actuales de estas directivas son:
upload_max_filesize 2M (debería cambiar éste)
post_max_size 8M (éste ya está bien)

Para evitar un cambio que afectaría a todos los scripts del servidor,
había pensado cambiar esas variables con la función ini_set() de
PHP. Pero eso me falla, os pongo el código que he usado para probar.

<?
echo "post_max_size = ".ini_get("post_max_size")."<br>";
echo "upload_max_filesize = ".ini_get("upload_max_filesize")."<br>";

if (ini_set("post_max_size", "100000"))
echo "Cambio en post max size<br>";
else
echo "No se pudo cambiar post max size<br>";

if (ini_set("upload_max_filesize", "100000"))
echo "Cambio en upload max filesize<br>";
else
echo "No se pudo cambiar max execution time<br>";

echo "post_max_size = ".ini_get("post_max_size")."<br>";
echo "upload_max_filesize = ".ini_get("upload_max_filesize")."<br>";
?>

Según el manual, (http://es.php.net/manual/en/function.ini-set.php)
las variables upload_max_filesize y post_max_size son de tipo
PHP_INI_PERDIR, con lo que sólo pueden cambiarse en php.ini, .htaccess
o httpd.conf.

Una primera sorpresa ha sido al usar ini_get_all() para ver qué permisos
tienen esas variables realmente (aparte de lo que diga el manual).
El resultado de print_r(ini_get_all()) ha arrojado esto (quito lo
que no importa):
[upload_max_filesize] => Array ( [global_value] => 2M [local_value] => 2M [access] => 6 )

O sea, que a nivel global y local está configurado 2M, y que los
permisos de acceso es 6!! Eso sería PHP_INI_PERDIR y PHP_INI_SYSTEM, según
la definición de constantes PHP_INI_* que aparece al final de la
info sobre la función ini_set().

Total, que a nivel local sí puedo cambiar estos valores en el mismo
php.ini, aunque eso afectará a todos los scripts y eso no me interesa.
Lo mismo si modifico httpd.conf.

Pero eso no me sirve porque este script acabará colocado en un host remoto,
bajo un dominio virtual en un ISP externo. Y estoy seguro que tampoco me
dejarán tocar ni el php.ini ni el httpd.conf de su servidor.

Así que he probado creando un fichero .htaccess y colocándolo en la
carpeta correspondiente. Siguiendo las sugerencias de un foro, he
probado con:
<Files edita_boletin.php>
php_value upload_max_filesize 6M
</Files>

Y también directamente con:
php_value upload_max_filesize 6M

Pero en ambos casos no ha funcionado, sigue cogiendo el valor de
php.ini (lo he comprobado usando ini_get()).

Las preguntas son:
* ¿Alguien sabe si es posible y cómo se podría cambiar esa variable dentro
de un fichero .htaccess, colocado convenientemente en el directorio que
corresponda?
* ¿Debo hablar con el ISP para ver las posibilidades reales y el
posible coste adicional de aplicar en el servidor esta modificación?
* ¿Se me está escapando algo importante? ¿Alguna configuración rara
del servidor puede afectar?

Apreciaría enormemente que me contárais vuestras experiencias en
casos similares y me dijérais qué solución usar. El cliente no
quiere ni hablar de la posibilidad de subir los ficheros por FTP,

Muchas gracias por adelantado,
Killer
--
killer@colacao.es

Search Discussions

  • Vicente at Jul 29, 2004 at 4:30 pm
    Killer escribió:

    KD> Pero eso no me sirve porque este script acabará colocado en un host remoto,
    KD> bajo un dominio virtual en un ISP externo. Y estoy seguro que tampoco me
    KD> dejarán tocar ni el php.ini ni el httpd.conf de su servidor.

    los ini_ no te servirán mucho para esto.
    Si lo tienes con Apache, como sabrás el PHP puede correr de dos
    maneras, como módulo (mod_php) y como CGI.
    Como módulo puedes resolver el asunto añadiendo un "php_value
    upload_max_filesize 100M" o lo que quieras en el htaccess, eso es
    todo. Si ya lo tienes como módulo has probado esto y no te funciona,
    entonces probablemente no tienes accesso a htaccess o bien el
    administrador ha situado directivas en el httpd.conf que están
    reescribiendo el .htaccess.

    Si lo tienes como CGI, entonces php buscará un posible php.ini en la
    carpeta del archivo y allí puedes modificar lo que quieras. Esta puede
    ser la mejor solución y no es trabajo para el administrador,.

    Si el administrador no colabora, todavía podrías hacer alguna cosa
    como por ejemplo subir el archivo desde la máquina del cliente
    por FTP o por e-mail sin que tenga que salir de la página web. Así a
    bote pronto pienso que se podría hacer por VB o WSH pero te puede dar
    algo de trabajo y obligar a la instalación de algo en la máquina
    cliente o hacer que se lo trage con un .cab o algo así, pero la cosa
    claro se lia.




    salud,




    KD> Las preguntas son:
    KD> * ¿Alguien sabe si es posible y cómo se podría cambiar esa variable dentro
    KD> de un fichero .htaccess, colocado convenientemente en el directorio que
    KD> corresponda?
    KD> * ¿Debo hablar con el ISP para ver las posibilidades reales y el
    KD> posible coste adicional de aplicar en el servidor esta modificación?
    KD> * ¿Se me está escapando algo importante? ¿Alguna configuración rara
    KD> del servidor puede afectar?

    KD> Apreciaría enormemente que me contárais vuestras experiencias en
    KD> casos similares y me dijérais qué solución usar. El cliente no
    KD> quiere ni hablar de la posibilidad de subir los ficheros por FTP,

    KD> Muchas gracias por adelantado,
    KD> Killer
    KD> --
    KD> killer@colacao.es




    --
    Saludos,

    killer@colacao.es
  • Killer Dog at Jul 29, 2004 at 9:32 pm
    Hola Vicente,

    V> los ini_ no te servirán mucho para esto.
    V> Si lo tienes con Apache, como sabrás el PHP puede correr de dos
    V> maneras, como módulo (mod_php) y como CGI.
    Efectivamente, en este caso concreto PHP se ejecuta como CGI
    independiente.

    V> Si lo tienes como CGI, entonces php buscará un posible php.ini en la
    V> carpeta del archivo y allí puedes modificar lo que quieras. Esta puede
    V> ser la mejor solución y no es trabajo para el administrador,.
    Ciertamente, no había pensado que pudiera colocar un php.ini en la
    misma carpeta del script. De todas maneras, lo he probado en local y
    no parece que coja el valor (quizás sea debido a no tener configurado
    el include path?) En el servidor remoto no lo he probado todavía...

    V> Si el administrador no colabora, todavía podrías hacer alguna cosa
    V> como por ejemplo subir el archivo desde la máquina del cliente
    V> por FTP o por e-mail sin que tenga que salir de la página web. Así a
    V> bote pronto pienso que se podría hacer por VB o WSH pero te puede dar
    V> algo de trabajo y obligar a la instalación de algo en la máquina
    V> cliente o hacer que se lo trage con un .cab o algo así, pero la cosa
    V> claro se lia.
    En este caso hemos tenido suerte: parece que el servidor donde se
    alojará la página está contratado como "semi-dedicado". El cliente
    dispone de varias webs y varios dominios, y todos están en la misma
    máquina. No ha habido ningún problema por parte del ISP para
    incrementar el valor de upload_max_filesize.

    Además, curiosamente el mismo script de prueba que os había indicado en
    mi primer email SI permite modificar el valor en el servidor remoto.
    Probablemente sea debido a diferente configuración y/o diferente
    versión de PHP (en local uso la 4.3.1 y el servidor remoto tiene la
    4.1.2)

    Gracias por tu aportación, Vicente. :^D

    Saludos,
    Killer
    --
    killer@colacao.es

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupphp-general-es @
categoriesphp
postedJul 28, '04 at 11:25a
activeJul 29, '04 at 9:32p
posts3
users2
websitephp.net

2 users in discussion

Killer Dog: 2 posts Vicente: 1 post

People

Translate

site design / logo © 2022 Grokbase