¿Por qué $_FILES estaría vacío al cargar archivos en PHP?

Resuelto elmonty asked hace 54 años • 22 respuestas

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 $_FILESmatriz está vacía. No hay ningún archivo en la c:\wamp\tmpcarpeta. Lo he configurado php.inipara permitir la carga de archivos y demás. La tmpcarpeta 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";
?>
elmonty avatar Jan 01 '70 08:01 elmonty
Aceptado

Aquí hay una lista de verificación para cargar archivos en PHP:

  1. Verifique php.ini para:
    file_uploads = On
    post_max_size = 100M
    upload_max_filesize = 100M
  • Es posible que necesites usar .htaccesso .user.inisi estás en un hosting compartido y no tienes acceso a php.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 no 100MB debería ser así .
  1. Asegúrese de que su <form>etiqueta tenga el enctype="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.

  2. Asegúrese de no tener dos campos de archivo de entrada con el mismo nameatributo. Si necesita admitir varios, coloque corchetes al final del nombre:

    <input type="file" name="files[]">
    <input type="file" name="files[]">
    
  3. 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.

  4. Asegúrese de que el destino de su archivo y los directorios tmp/upload no tengan espacios.

  5. Asegúrese de que todos <form>los mensajes en su página tengan </form>etiquetas de cierre.

  6. Asegúrese de que su etiqueta FORM tenga method="POST". Las solicitudes GET no admiten cargas de datos de formularios o de varias partes.

  7. 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.

  8. Asegúrese de no estar utilizando Javascript para deshabilitar su <input type="file">campo al enviar

  9. Asegúrate de no anidar formularios como<form><form></form></form>

  10. Verifique su estructura HTML en busca de etiquetas no válidas o superpuestas como<div><form></div></form>

  11. También asegúrese de que el archivo que está cargando no tenga caracteres que no sean alfanuméricos.

  12. 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 $_FILESquedara vacía.

  13. Podría intentar evitar los guiones bajos ( _) en el name=""atributo de la <input>etiqueta .

  14. Intente cargar archivos muy pequeños para determinar si se trata de un problema de tamaño del archivo.

  15. 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.

  16. 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/

shamittomar avatar Aug 27 '2010 18:08 shamittomar

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.iniconfiguración, a veces en los sistemas php.iniexisten varios archivos. Asegúrese de editar el correcto. Sé que dijo que configuró su php.iniarchivo para que se carguen archivos, pero ¿también configuró upload_max_filesizey post_max_sizepara 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.inicambios?


Brian avatar Aug 27 '2010 18:08 Brian

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>
meda avatar Mar 28 '2016 03:03 meda

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.

elmonty avatar Aug 29 '2010 14:08 elmonty

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_sizeestá arriba 20mbpero la matriz es null. La respuesta es que nuestra post_max_sizedebería ser mayor que upload_max_filesize

post_max_size = 750M  
upload_max_filesize = 750M
shashik493 avatar Feb 11 '2015 06:02 shashik493