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 queupload_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, comopost_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 serroot
. 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/
-checkdir1
ydir2
.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"