2012-09-21 145 views
19

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

archivos deben ser almacenados en /upload directorio y no en el sistema por defecto /tmp directorio, porque /tmp está montado en un disco RAM que tiene su tamaño limitado a 4 MB   y el usuario será la posibilidad de subir archivos a unos 10   MB.

He buscado muchas páginas web, pero ninguna de las soluciones ha funcionado. he fijado en el directorio temporal php.ini:

upload_tmp_dir =/upload 

he establecer permisos a la /upload dir y Apache es propietario del archivo, por lo que el directorio es definitivamente escribible por PHP.

He establecido la ruta de destino en el cargador de archivos al /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 cargan exitosamente, pero los archivos de más de 4   MB no se pueden subir; la única razón de este comportamiento que se me ocurre 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 -así que 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á configurada, por lo que el acceso de PHP al disco solo está limitado por los permisos de archivo.

+2

¿Ha reiniciado el servidor (lo siento por esta pregunta tonta)? – soju

+0

No hay preguntas tontas, solo respuestas tontas :). Sí, lo he hecho muchas veces al intentar resolver el problema y probar diferentes soluciones. – Wookie88

+0

¿Comprobó que php no está instalado como mod cgi? (De doc: * Si el directorio especificado aquí no es modificable, PHP vuelve al directorio temporal predeterminado del sistema *) – soju

Respuesta

50

El problema descrito aquí fue resuelto por mí hace mucho tiempo, pero realmente no recuerdo cuál fue el motivo principal por el que las cargas no funcionaban. Había varias cosas que era necesario corregir para que la carga pudiera funcionar. Creé 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 antes en el chat, estaba trabajando en un sistema integrado, por lo que algunos puntos pueden omitirse en sistemas no integrados.

  • Verificar upload_tmp_dir en php.ini. Este es un directorio donde PHP almacena archivos temporales durante la carga.

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

  • Compruebe post_max_size en php.ini. Si desea cargar archivos de 20 Mbytes, intente con 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 un script puede consumir. Es bastante obvio que no puede ser más bajo que el tamaño de carga (para ser sincero, no estoy muy seguro al respecto; es probable que PHP esté almacenando en el búfer al copiar archivos temporales).

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

  • Comprobar lo que el usuario ejecuta como php (Vea aquí cómo hacerlo: How to check what user php is running as?). He trabajado en diferentes distros y servidores. A veces es apache, pero a veces puede ser root. De todos modos, compruebe que este usuario tenga derechos para leer y escribir en el directorio y directorio temporal en el que está cargando. Compruebe todos los directorios de la vía en caso de que está subiendo al sub-directorio (por ejemplo /dir1/dir2/ -check tanto dir1 y dir2.

  • En plataformas integradas a veces es necesario restringir escrito al sistema de ficheros raíz, ya que se almacena en la tarjeta flash y esto ayuda a prolongar la vida útil de esta tarjeta. Si usa scripts para habilitar/deshabilitar las escrituras, asegúrese de habilitar la escritura antes de cargar.

  • Tuve serios problemas con PHP> 5.4 carga de monitoreo basado 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, puede probar el mech más sofisticado anismos.

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

+0

Lista de verificación agradable - gracias! – Olaf

+0

'memory_limit' no es un problema para las cargas. Consulte http://stackoverflow.com/a/5828654/956397 – PiTheNumber

+0

Si no planea leer el archivo completo en PHP, tiene razón. Sin embargo, es bueno mantener este punto en la lista de verificación para que sea más universal. – Wookie88

1

tuve problemas con este problema desde hace 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 modificar el 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 veía así .... (la output_buffering no es probable que necesita para este problema)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M