¿Por qué FILES FILES estaría vacío al subir archivos a 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 que se carga, pero en PHP, el array $_FILES está vacío. No hay ningún archivo en la carpeta c:\wamp\tmp. He configurado php.ini para permitir la carga de archivos y demás. La carpeta tmp 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";
?>
Author: Nikola K., 2010-08-27

20 answers

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

  1. Compruebe php.ini para:
    file_uploads = On
    post_max_size = 100M
    upload_max_filesize = 100M

    • Es posible que deba usar .htaccess o .user.ini si está en un alojamiento compartido y no tiene acceso a php.ini.
    • Asegúrese estás editando el archivo ini correcto – utilice la función phpinfo() para verificar su los ajustes se están aplicando.
    • También asegúrese de que no escribe correctamente los tamaños - debe ser 100M no 100MB.
  2. Asegúrese de que su etiqueta <form> tenga el atributo enctype="multipart/form-data". Ninguna otra etiqueta funcionará, tiene que ser tu etiqueta de FORMULARIO. Compruebe que está escrito correctamente. Verifique que multipart/form-data está rodeado por COMILLAS RECTAS, no tipográficas de pegar desde Word O desde un sitio web blog (WordPress convierte comillas rectas en ángulo de citas!). Si tienes varios formularios en la página, asegúrate de que ambos tengan este atributo. Escríbelos manualmente o inténtalo comillas simples escritas manualmente.

  3. Asegúrese de que no tiene dos campos de archivo de entrada con el mismo atributo name. Si necesita soporte múltiple, ponga corchetes al final del nombre:

    <input type="file" name="files[]">
    <input type="file" name="files[]">
    
  4. Asegúrese de que sus directorios tmp y upload tengan los permisos de lectura y escritura correctos. La carpeta de carga temporal se especifica en la configuración de PHP como upload_tmp_dir.

  5. Asegúrese de que el destino del archivo y los directorios tmp/upload lo hagan ni tener espacios en ellos.

  6. Asegúrese de que todos los <form>'s en su página tienen </form> etiquetas de cierre.

  7. Asegúrate de que tu etiqueta de FORMULARIO tenga method="POST". Las solicitudes GET no admiten cargas de datos de varias partes/formularios.

  8. Asegúrate de que la etiqueta de entrada de archivo tenga un atributo NAME. Un atributo ID NO es suficiente! Los atributos ID son para uso en el DOM, no para cargas útiles POST.

  9. Asegúrese de que no está utilizando Javascript para desactivar su campo <input type="file"> en submission

  10. Asegúrese de que no está anidando formas como <form><form></form></form>

  11. Compruebe su estructura HTML para etiquetas no válidas / superpuestas como <div><form></div></form>

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

  13. Una vez, pasé horas tratando de averiguar 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 causando que la carga fallara y $_FILES estuviera vacía.

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

  15. Intente cargar archivos muy pequeños para reducir si se trata de un problema de tamaño de archivo.

  16. Compruebe el espacio disponible en disco. Aunque es muy raro, se menciona en esta Página de manual de PHP comentario :

    Si la matriz suddenly _FILES se ejecuta repentinamente misteriosamente vacío, a pesar de que su formulario parece correcto, usted debe comprobar el espacio en disco disponible para su partición de carpeta temporal. En mi instalación, todas las cargas de archivos fallaron sin previo aviso. Después de mucho rechinar de dientes, traté de liberar espacio adicional, después de lo cual las cargas de archivos de repente volvieron a funcionar.

Fuente para algunos de estos points:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/

 399
Author: shamittomar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-04 05:14:36

En cuanto al HTML, parece haber configurado esa parte correctamente. Ya tiene el enctype="multipart/form-data" que es muy importante tener en el formulario.

En cuanto a su configuración php.ini, a veces en los sistemas existen varios archivos php.ini. Asegúrese de que está editando el correcto. Sé que ha dicho que ha configurado su archivo php.ini para que tenga cargas de archivos, pero ¿también ha configurado su upload_max_filesize y post_max_size para que sean más grandes que el archivo que está tratando de cargar? Así que 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

Hace su directorio: "c:\wamp\tmp" ¿tiene permisos de lectura y escritura? ¿Recordaste reiniciar Apache después de hacer los cambios php.ini?


 63
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-01 20:50:06

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>
 27
Author: meda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-28 03:41:33

Gracias a todos por las variadas respuestas exhaustivas. Todos 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.

 14
Author: elmonty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-08 20:18:23

Asegúrese de que su form tenga el siguiente atributo enctype="multipart/form-data".

 8
Author: Johann Burgess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-30 12:21:24

Aquí otra causa que encontré: Cuando se utiliza jQuery Mobile y el atributo de formulario data-ajax se establece en true, la matriz de ARCHIVOS estará vacía. Así que establece data-ajax en false.

 4
Author: dutchman711,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-15 10:59:23

Asegúrese de que su elemento de entrada tiene un atributo 'name'. <input type="file" name="uploadedfile" />

Si falta esto, losILES _FILES estarán vacíos.

 3
Author: Adrian Parr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-18 15:52:39

Tengo un mismo problema buscando 2 horas ,es muy simple que comprobemos 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 nuestro upload_max_size está por encima de 20mb pero la matriz es null. La respuesta es que nuestro post_max_size debe ser mayor que upload_max_filesize

post_max_size = 750M  
upload_max_filesize = 750M
 3
Author: shashik493,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-03 04:51:51

Estaba luchando con el mismo problema y probando todo, no obteniendo informes de errores y nada parecía estar mal. Yo tenía error_reporting (E_ALL) Pero de repente me di cuenta de que no había comprobado el registro de Apache y voilà! Hubo un error de sintaxis en el script...! (falta un "}" )

Así que, aunque esto es algo evidente para ser comprobado, puede ser olvidado... En mi caso (linux) es en:

/var/log/apache2/error.log
 3
Author: Luis Rosety,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-16 06:41:28

Si está tratando de cargar una matriz de archivos, es posible que deba aumentar max_file_uploads en php.ini que por defecto se establece en 20

Nota: max_file_uploads no se puede cambiar fuera de php.ini. Ver Error de PHP" #50684

 2
Author: Tahir Yasin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-15 12:30:06

Otro posible culpable son las redirecciones de apache. En mi caso tenía el httpd de Apache.configuración configurada para redirigir ciertas páginas de nuestro sitio a versiones http, y otras páginas a versiones https de la página, si aún no lo estaban. La página en la que tenía un formulario con una entrada de archivo era una de las páginas configuradas para forzar ssl, pero la página designada como la acción del formulario estaba configurada para ser http. Así que la página enviaría la carga a la versión ssl de la página de acción, pero Apache era redirigirlo a la versión http de la página y los datos post, incluido el archivo cargado, se perdió.

 2
Author: user2723315,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-27 22:15:35

Nadie mencionó esto, pero me ayudó y no muchos lugares en la red lo mencionan.

Asegúrese de que su php.ini establece la siguiente clave:

    upload_tmp_dir="/path/to/some/tmp/folder"

Tendrás que consultar con tu webhost si quieren que utilices una ruta de acceso absoluta al archivo del servidor. Debería poder ver otros ejemplos de directorios en su php.archivo ini para determinar esto. Tan pronto como lo configuré, obtuve valores en mi objeto _FILES.

Finalmente asegúrese de que su carpeta tmp y donde quiera que esté moviendo archivos tener los permisos correctos para que puedan ser leídos y escritos.

 2
Author: AaronP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-08 21:45:32

Me encontré con el mismo problema y descubrí que mi IDE era parte del problema. Estaba lanzando el depurador directamente desde el IDE (PhpStorm) en lugar de solo usar el navegador directamente. La URL generada por el IDE fue así:

"...localhost:63342/CB_Upload/index.php?_ijt=j2hcbacqepj87bvg66ncuohvne"

Y solo usando:

"...localhost/CB_Upload/index.php"

Funcionó bien. Mi configuración es PC / Windows 10 / WAMPSERVER 3.0.6 64bit

 1
Author: Marc M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-26 19:09:51

Compruebe su php.ini for enable_post_data_reading = On , porque:

Deshabilitar esta opción hace que $_POST y {_FILES no se rellenen . La única forma de leer postdata será a través del contenedor de flujo de entrada php://. (... )

En http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading

 1
Author: jmng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-18 10:09:03

Tengo el mismo problema y ninguno de tema fue mi error. Revisa tu .archivo htaccess, si tiene uno, si" MultiViews " están habilitados. Tuve que desactivarlos.

 0
Author: Murolack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-16 18:58:14

Si su script principal es http://Some_long_URL/index.php tenga cuidado de especificar la URL completa (con index.php explícito y no solo http://Some_long_URL) en el campo action. Sorprendentemente, si no, se ejecuta el script correcto, pero con en empty _ _FILES !

 0
Author: Gibbie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-12 17:45:09

Tuve un problema similar y el problema estaba en un valor incorrecto en htaccess como mencionó shamittomar.

Cambiar php_value post_max_size 10MB a php_value post_max_size 10M

 0
Author: Johnny Vietnam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-16 12:53:32

Estaba vacío $_FILES porque después de <form enctype="multipart/form-data" method="post"> puse

</div>
<div style="clear:both"></div>

El código inicial era como

<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
<form enctype="multipart/form-data" method="post">
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>

Decidí modificar y

<div>
<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
<form enctype="multipart/form-data" method="post">
</div>
<div style="clear:both"></div>
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>
<div style="clear:both"></div>

Así que la conclusión es que después de <form enctype="multipart/form-data" method="post"> debe ser <input name, type, id y no debe ser <div> o algunas otras etiquetas

En mi situación el código correcto era

<div>
<span class="span_left">Photos (gif/jpg/jpeg/png) </span>
</div>
<div style="clear:both"></div>
<form enctype="multipart/form-data" method="post">
<input name="files[]" type="file" id="upload_file" />
<input type="button" id="upload" value="Upload photo" />
</form>
<div style="clear:both"></div>
 0
Author: Andris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-22 06:08:24

Yo también tuve problemas conILES _FILES vacíos. La lista de verificación anterior no menciona MultiViews en .htaccess, httpd.conf o httpd-vhost.conf.

Si tiene MultiViews configuradas en la directiva options para su directorio que contiene el sitio web, $_FILES estará vacío, aunque el encabezado Content-Length muestre que el archivo que subí.

 0
Author: gerteb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-31 10:00:39

Si está utilizando jQuery Mobile

El uso de un formulario multiparte con una entrada de archivo no es compatible con Ajax. En este caso, debe decorar el formulario padre con data-ajax = "false" para asegurarse de que el formulario se envíe correctamente al servidor.

<form action="upload.php" method="post" enctype="multipart/form-data"  data-ajax="false">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>
 0
Author: Rajan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-22 17:49:03