2009-11-30 15 views
15

Tengo un script de carga muy básico, probablemente levantado directamente de la página de funciones de php.net/move_upload_files.Subida de archivos PHP, desaparecen los archivos de/tmp antes de mover archivos_instalados

move_uploaded_file() ha fallado porque no puede encontrar el archivo tmp en la carpeta tmp. Pero SÉ que se está poniendo allí, pero se elimina antes de que move_upload_file() pueda manejarlo en mi script. Sé que se está colocando allí porque puedo ver un archivo allí cuando se está publicando un archivo grande en el servidor.

También $_FILES contiene detalles correctos del archivo que acabo de cargar.

¿Alguien tenía alguna idea de por qué el archivo temporal se está eliminando de/tmp antes de que tenga la oportunidad de manejarlo?

Aquí está el código básico que estoy usando.

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file)) 
{ 
    $result['error'] = 'false'; 
    $result['file_loc'] = $upload_file; 
} 
else 
{ 
    $result['error'] = 'true'; 
} 

La salida de print_r($_FILES) parece

[userfile] => Array 
(
    [name] => switchsolo.png 
    [type] => image/png 
    [tmp_name] => /tmp/phpIyKRl5 
    [error] => 0 
    [size] => 6690 
) 

Pero/tmp/phpIyKRl5 simplemente no está allí.

+0

Publique su formulario HTML. Creo que el problema está en tu HTML. –

+0

¿Cuál es el mensaje exacto que move_uploaded_file() te da? –

+0

Por favor, publique el mensaje de su registro de errores –

Respuesta

-1

Su form debe utilizar una etiqueta como esta:

<form method="post" enctype="multipart/form-data" action="..."> 

Uso multiple/form-data como enctype.

+2

¿$ _FILES no estaría vacío si el enctype fuera incorrecto? –

+0

No estoy seguro, no he probado esto. Pero por experiencia, cada vez que olvido enctype = "mult ...", no tengo ningún archivo. Verificando esto es fácil. Use encabezados de Live HTTP o similares y vea si el archivo se envía. –

+0

Definitivamente tienen eso allí. – Bowen

0

¿Está 100% seguro de que el archivo en realidad se creó en/tmp? Si no tiene permiso de escritura (o el usuario se ejecuta el script), el archivo no se escribirá en/tmp, pero (supongo) lo verá durante la carga, aunque en realidad no está allí cuando termine la carga.

Editar: $ _FILES ['file'] ['error'] - Valor: 7; Error al escribir el archivo en el disco. Introducido en PHP 5.1.0. Así que revisa tu versión de PHP. Si está por debajo de 5.1 escribir en el disco podría ser su problema.

+0

100% seguro, puedo ver que se crea cuando realizo una carga de archivo más grande, pero tan pronto como está completo parece desaparecer. – Bowen

+0

Ah, acaba de leer el resto del comentario. Estamos ejecutando 5.2, y, por el momento, la carpeta tmp es 777 – Bowen

-2

Está utilizando el valor de retorno de move_uploaded_file() al revés:

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file)) 
{ 
    $result['error'] = 'true'; 
} 
else 
{ 
    $result['error'] = 'false'; 
    $result['file_loc'] = $upload_file; 
} 
+1

¡Seguramente la función devuelve TRUE si se ha ejecutado con éxito? – Bowen

0

He tenido este problema por mí mismo. En mi caso, php estaba cargando a la carpeta incorrecta tmp. En lugar de usar la carpeta domains tmp (en un host virtual en plesk) se estaba cargando directamente a la carpeta temporal del sistema operativo.

Comprobar la configuración de las carpetas temporales

6

se elimina el archivo después de la secuencia de comandos haya terminado de ejecutarse. Si ejecuta su secuencia de comandos y luego revisa la carpeta/tmp /, el archivo no estará allí pase lo que pase.

10

1) ¿Los valores de tamaño de archivo post_max_size y upload_max_filesize tienen un valor mayor que el tamaño del archivo que está intentando cargar?

2) ¿Su script de carga tarda más tiempo en ejecutarse de lo que permite el valor de la variable max_execution_time?

3) Supongo que su script de carga no consume tanta memoria como permite la variable memory_limit. Cuando el cliente está cargando el archivo en el servidor, entonces el servidor probablemente guarda algo de eso en la memoria mientras lo hace. No estoy seguro si de alguna manera afecta el límite de la variable memory_limit en php.ini.

Estas variables se pueden cambiar en php.ini y/o .htaccess o con ini_set().

Espero que ayude.

+2

Cada vez que tengo un problema de carga de archivos, se resuelve prestando atención a 1 o 2. +1 – bradym

0

Para referencia futura, esto también puede suceder cuando Apache no tiene acceso al directorio de destino (¡Recuerde cambiar las ACL!).

0

Tuve el mismo problema, donde 'tmp_name' diría que está siendo almacenado en '/ private/var/tmp /' pero el archivo no existiría allí.

Tuve que agregar "E" a mi "orden de variables" en php.ini ; variables_order Valor predeterminado: "EGPCS"

Espero que esto ayude.

1

Estaba teniendo este problema, así, encontré este sitio web para una solución - no conseguirlo aunque;)

que estaba recibiendo la información correcta cuando se visualiza print_r($_FILES) pero fue incapaz de ejecutar move_uploaded_file ...

He resuelto el problema marcando el $upload_file atributo de ruta en la función move_uploaded_file - asegúrese de que sea correcto, de lo contrario no funcionará (el mío era incorrecto).

Además, el archivo en la ubicación temporal se elimina automáticamente, creo que esa es la forma en que funciona PHP.

Espero que haya sido de ayuda.

+0

+1 por mencionar que el archivo temporal se elimina después de que termina la secuencia de comandos. Todavía no había hecho ningún move_upload_file ... estaba trabajando todo el tiempo. – djnz0feh

1

También puede ser que su carpeta de destino no exista o no tenga permiso de escritura.

0

prueba simple de hacer justo antes de la función move_uploaded_file():

if (!file_exists("upload")) { 
    if (mkdir("upload")) { 
    echo "Upload directory created!"; 
    } 
    else { 
    die("Invalid upload directory!"); 
    } 
} 
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 
0

tener cuidado con sus $ upload_file. podría haber sido la falta de un "/" cuando concatena la ruta de la carpeta y el nombre del archivo cargado.

Cuestiones relacionadas