upload_tmp_dir upload_err_no_tmp_dir example php file-upload valums-file-uploader

php - example - upload_err_no_tmp_dir solution



ConfiguraciĆ³n de PHP tmp dir-PHP upload no funciona (3)

El problema descrito aquí lo resolví hace bastante tiempo, pero no recuerdo cuál fue la razón principal por la que las cargas no funcionaban. Había varias cosas que necesitaban ser arregladas para que la carga funcionara. He creado una lista de verificación que podría ayudar a otros a tener problemas similares y la editaré para que sea lo más útil posible. Como dije anteriormente en el chat, estaba trabajando en un sistema integrado, por lo que algunos puntos pueden omitirse en sistemas no integrados.

  • Compruebe upload_tmp_dir en php.ini. Este es el directorio donde PHP almacena los archivos temporales mientras se carga.

  • Compruebe open_basedir en php.ini. Si está definido, limita los derechos de lectura / escritura de PHP a la ruta especificada y sus subdirectorios. Asegúrese de que upload_tmp_dir está dentro de esta ruta.

  • Compruebe post_max_size en php.ini. Si desea cargar archivos de 20 Mbytes, intente algo un poco más grande, como post_max_size = 21M . Esto define el tamaño más grande del mensaje POST que probablemente esté utilizando durante la carga.

  • Compruebe upload_max_filesize en php.ini. Esto especifica el archivo más grande que se puede cargar.

  • Compruebe memory_limit en php.ini. Esa es la cantidad máxima de memoria que puede consumir un script. Es bastante obvio que no puede ser más bajo que el tamaño de la carga (para ser honesto, no estoy muy seguro de eso, PHP probablemente está almacenando en búfer al copiar archivos temporales).

  • Asegúrese de que está revisando el archivo php.ini correcto que es utilizado por PHP en su servidor web. La mejor solución es ejecutar el script con la directiva descrita aquí http://php.net/manual/en/function.php-ini-loaded-file.php (función php_ini_loaded_file )

  • Compruebe qué usuario ejecuta php (consulte aquí cómo hacerlo: cómo comprobar qué usuario ejecuta php ). He trabajado en diferentes distribuciones y servidores. A veces es apache , pero a veces puede ser root . De todos modos, verifique que este usuario tenga derechos para leer y escribir en el directorio temporal y el directorio en el que está subiendo. Verifique todos los directorios en la ruta en caso de que esté cargando en el subdirectorio (por ejemplo /dir1/dir2/ -check dir1 y dir2 .

  • En plataformas integradas, a veces es necesario restringir la escritura en el sistema de archivos raíz porque está almacenada en una tarjeta flash y esto ayuda a prolongar la vida útil de esta tarjeta. Si está utilizando scripts para habilitar / deshabilitar las escrituras de archivos, asegúrese de habilitar la escritura antes de cargar.

  • Tuve problemas serios con la supervisión de carga de PHP> 5.4 basada en sesiones (como se describe aquí http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/ ) en algunas plataformas. Intente algo simple al principio (como aquí: http://www.dzone.com/snippets/very-simple-php-file-upload ). Si funciona, puedes probar mecanismos más sofisticados.

  • Si realiza algún cambio en php.ini, recuerde reiniciar el servidor para que la configuración se vuelva a cargar.

Estoy trabajando en la carga de archivos a través de una página web con una barra de progreso usando el cargador de archivos de Valums . Casi todo funciona bien, pero no puedo cambiar el directorio tmp predeterminado, donde se almacena el archivo durante la carga.

Los archivos deben almacenarse en el directorio /upload y no en el directorio system /tmp predeterminado, porque /tmp está montado en un disco RAM que tiene un tamaño limitado a 4 MB y el usuario cargará archivos de aproximadamente 10 MB.

He buscado en muchas páginas web, pero ninguna de las soluciones funcionó. He configurado el directorio temporal en php.ini :

upload_tmp_dir =/upload

He establecido permisos para el directorio /upload , y apache es el propietario del archivo, por lo que el directorio definitivamente se puede escribir en PHP.

He establecido la ruta de destino en el cargador de archivos a /upload , porque quiero que los archivos se almacenen después de la carga también en este directorio. El resultado final es que los archivos pequeños se están cargando con éxito, pero los archivos de más de 4 MB no se cargan, la única razón de este comportamiento que me viene a la mente es que los archivos se almacenan en /tmp durante la carga. Para estar seguro, lo he comprobado con sys_get_temp_dir() y el resultado fue /tmp -so PHP ignora mi directiva php.ini o hay alguna otra forma de establecer dónde se almacenan los archivos durante la carga.

Ah, y la última información: open_basedir no está establecida, por lo que el acceso de PHP al disco solo está limitado por los permisos de los archivos.


Luché con este problema durante mucho tiempo ... Mi solución fue modificar el archivo php.ini, en la carpeta que contenía el script php. Esto fue importante, ya que la modificación de php.ini en la raíz no resolvió el problema (tengo un php.ini en cada carpeta para el control granular). Las entradas relevantes en mi php.ini se parecían a esto ... (es probable que no se necesite el output_buffering para este problema)

output_buffering = On upload_max_filesize = 20M post_max_size = 21M


crear un archivo php con:

<?php print shell_exec( ''whoami'' ); ?>

o

<?php echo exec(''whoami''); ?>

Prueba la salida en tu navegador web. Si la salida no es su ejemplo de usuario: www-data , continúe con el siguiente paso

abrir como root:

/ etc / apache2 / envvars

busca estas lineas:

exportar APACHE_RUN_USER = nombre de usuario

exportar APACHE_RUN_GROUP = nombre de grupo

ejemplo:

export APACHE_RUN_USER = www-data

export APACHE_RUN_GROUP = www-data

dónde:

username = su nombre de usuario que tiene acceso a la carpeta que está utilizando group = group que le ha dado acceso de lectura + escritura + ejecución

cambiarlo a

export APACHE_RUN_USER = "nombre de usuario"

export APACHE_RUN_GROUP = "grupo"

Si tu usuario aún no tiene acceso:

sudo chmod 775 -R "directorio de la carpeta a la que desea dar acceso r / w / x"