¿Por qué $_FILES estaría vacío al cargar archivos en PHP?
Tengo WampServer 2 instalado en mi computadora con Windows 7. Estoy usando Apache 2.2.11 y PHP 5.2.11. Cuando intento cargar cualquier archivo desde un formulario, parece cargarse, pero en PHP, la $_FILES
matriz está vacía. No hay ningún archivo en la c:\wamp\tmp
carpeta. Lo he configurado php.ini
para permitir la carga de archivos y demás. La tmp
carpeta tiene privilegios de lectura/escritura para el usuario actual. Estoy perplejo.
HTML:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form enctype="multipart/form-data" action="vanilla-upload.php" method="POST">
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>
PHP:
<?php
echo 'file count=', count($_FILES),"\n";
var_dump($_FILES);
echo "\n";
?>
Aquí hay una lista de verificación para cargar archivos en PHP:
- Verifique php.ini para:
file_uploads = On
post_max_size = 100M
upload_max_filesize = 100M
- Es posible que necesites usar
.htaccess
o.user.ini
si estás en un hosting compartido y no tienes acceso aphp.ini
. - Asegúrese de que está editando el archivo ini correcto; use la
phpinfo()
función para verificar que su configuración realmente se esté aplicando. - También asegúrese de no escribir mal los tamaños;
100M
no100MB
debería ser así .
Asegúrese de que su
<form>
etiqueta tenga elenctype="multipart/form-data"
atributo. Ninguna otra etiqueta funcionará, tiene que ser su etiqueta FORM. Verifique que esté escrito correctamente . Verifique que los datos multiparte/formulario estén rodeados de CITAS RECTAS, no de comillas tipográficas pegadas desde Word O desde un blog de un sitio web (¡WordPress convierte comillas rectas en comillas angulares!). Si tiene varios formularios en la página, asegúrese de que ambos tengan este atributo. Escríbalos manualmente o pruebe con comillas simples escritas manualmente.Asegúrese de no tener dos campos de archivo de entrada con el mismo
name
atributo. Si necesita admitir varios, coloque corchetes al final del nombre:<input type="file" name="files[]"> <input type="file" name="files[]">
Asegúrese de que sus directorios tmp y de carga tengan configurados los permisos de lectura y escritura correctos. La carpeta de carga temporal se especifica en la configuración de PHP como
upload_tmp_dir
.Asegúrese de que el destino de su archivo y los directorios tmp/upload no tengan espacios.
Asegúrese de que todos
<form>
los mensajes en su página tengan</form>
etiquetas de cierre.Asegúrese de que su etiqueta FORM tenga
method="POST"
. Las solicitudes GET no admiten cargas de datos de formularios o de varias partes.Asegúrese de que la etiqueta de entrada de su archivo tenga un atributo NOMBRE. ¡Un atributo de ID NO es suficiente! Los atributos de ID se utilizan en el DOM, no para cargas útiles POST.
Asegúrese de no estar utilizando Javascript para deshabilitar su
<input type="file">
campo al enviarAsegúrate de no anidar formularios como
<form><form></form></form>
Verifique su estructura HTML en busca de etiquetas no válidas o superpuestas como
<div><form></div></form>
También asegúrese de que el archivo que está cargando no tenga caracteres que no sean alfanuméricos.
Una vez, pasé horas tratando de descubrir por qué me estaba pasando esto de repente. Resultó que había modificado algunas de las configuraciones de PHP en
.htaccess
, y una de ellas (aún no estoy seguro de cuál) estaba provocando que la carga fallara y$_FILES
quedara vacía.Podría intentar evitar los guiones bajos (
_
) en elname=""
atributo de la<input>
etiqueta .Intente cargar archivos muy pequeños para determinar si se trata de un problema de tamaño del archivo.
Verifique su espacio disponible en disco. Aunque es muy raro, se menciona en el comentario de esta página del Manual de PHP :
Si la matriz $_FILES de repente se vacía misteriosamente, aunque su formulario parezca correcto, debe verificar el espacio en disco disponible para la partición de su carpeta temporal. En mi instalación, todas las cargas de archivos fallaron sin previo aviso. Después de mucho crujir de dientes, intenté liberar espacio adicional, después de lo cual la carga de archivos de repente volvió a funcionar.
Asegúrese de no enviar el formulario a través de una solicitud POST AJAX en lugar de una solicitud POST normal que hace que la página se recargue. Revisé todos y cada uno de los puntos de la lista anterior y finalmente descubrí que la razón por la cual mi variable $_FILES estaba vacía era que estaba enviando el formulario mediante una solicitud POST AJAX. Sé que también existen métodos para cargar archivos usando ajax, pero esta podría ser una razón válida por la cual su matriz $_FILES está vacía.
Fuente de algunos de estos puntos:
https://web.archive.org/web/20050426084124/http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/
En cuanto al HTML, parece que has configurado esa parte correctamente. Ya tienes lo enctype="multipart/form-data"
cual es muy importante tener en el formulario.
En cuanto a su php.ini
configuración, a veces en los sistemas php.ini
existen varios archivos. Asegúrese de editar el correcto. Sé que dijo que configuró su php.ini
archivo para que se carguen archivos, pero ¿también configuró upload_max_filesize
y post_max_size
para que sea más grande que el archivo que está intentando cargar? Entonces deberías tener:
file_uploads = On; sounds like you already did this
post_max_size = 8M; change this higher if needed
upload_max_filesize = 8M; change this higher if needed
¿Su directorio: "c:\wamp\tmp"
tiene permisos de lectura y escritura? ¿Recordó reiniciar Apache después de realizar los php.ini
cambios?
Es importante agregar enctype="multipart/form-data"
a su formulario, ejemplo
<form action="upload.php" method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submit">
</form>
Gracias a todos por las variadas respuestas completas. Todos ellos son muy útiles. La respuesta resultó ser algo muy extraño. Resulta que a PHP 5.2.11 no le gusta lo siguiente:
post_max_size = 2G
o
post_max_size = 2048M
Si lo cambio a 2047M
, la carga funciona.
Tengo el mismo problema al mirar 2 horas, es muy simple verificar primero la configuración de nuestro servidor.
Ejemplo:
echo $upload_max_size = ini_get('upload_max_filesize');
echo $post_max_size=ini_get('post_max_size');
cualquier tipo de tamaño de archivo es :20mb
, pero el nuestro upload_max_size
está arriba 20mb
pero la matriz es null
. La respuesta es que nuestra post_max_size
debería ser mayor que upload_max_filesize
post_max_size = 750M
upload_max_filesize = 750M