Tengo instalado WampServer 2 en mi computadora con Windows 7. Estoy usando Apache 2.2.11 y PHP 5.2.11. Cuando intento cargar cualquier archivo de un formulario, parece cargar, pero en PHP, la $_FILES
matriz está vacía. No hay archivo en la c:\wamp\tmp
carpeta. He configurado php.ini
para permitir la carga de archivos y tal. 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";
?>
php
apache
file-upload
elmonty
fuente
fuente
vanilla-upload.php
?Respuestas:
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
.htaccess
o.user.ini
si está en un alojamiento compartido y no tiene accesophp.ini
.phpinfo()
función para verificar que su configuración se esté aplicando realmente.100M
así100MB
.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 COTIZACIONES DIRECTAS, no comillas inteligentes pegadas desde Word O desde un blog del 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 intente con comillas simples escritas manualmente.Asegúrese de no tener dos campos de archivo de entrada con el mismo
name
atributo. Si necesita admitir múltiples, ponga corchetes al final del nombre:Asegúrese de que sus directorios tmp y upload tengan los permisos correctos de lectura + escritura establecidos. 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 en ellos.
Asegúrese de que todos
<form>
los elementos de su página tengan</form>
etiquetas cercanas.Asegúrese de que su etiqueta FORM tenga
method="POST"
. Las solicitudes GET no admiten cargas multiparte / datos de formulario.Asegúrese de que su etiqueta de entrada de archivo tenga un atributo NAME. ¡Un atributo de ID NO es suficiente! Los atributos de ID se usan en DOM, no para cargas POST.
Asegúrese de no estar usando Javascript para deshabilitar su
<input type="file">
campo en el envíoAsegúrate de no anidar formas como
<form><form></form></form>
Verifique su estructura HTML para etiquetas inválidas / superpuestas como
<div><form></div></form>
También asegúrese de que el archivo que está cargando no contenga caracteres no alfanuméricos.
Una vez, pasé horas tratando de descubrir por qué esto me estaba sucediendo de repente. Resultó que había modificado algunas de las configuraciones de PHP
.htaccess
, y una de ellas (aún no estoy segura de cuál) estaba causando que la carga fallara y$_FILES
quedara vacía.Podría intentar evitar los guiones bajos (
_
) en elname=""
atributo de la<input>
etiquetaIntente cargar archivos muy pequeños para reducir si se trata de un problema de tamaño de archivo.
Verifique su espacio disponible en disco. Aunque es muy raro, se menciona en este comentario de la página del Manual de PHP :
Asegúrese de no enviar el formulario a través de una solicitud POST de AJAX en lugar de una solicitud POST normal que hace que una página se vuelva a cargar. 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 usando una solicitud POST AJAX. Sé que también hay métodos para cargar archivos usando ajax, pero esta podría ser una razón válida por la que su matriz $ _FILES está vacía.
Fuente para algunos de estos puntos:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/
fuente
<form><form><input type="file"></form></form>
$('#my-form')[0].reset();
en el controlador de envío.En cuanto al HTML, parece que ha configurado esa parte correctamente. Ya tienes lo
enctype="multipart/form-data"
que es muy importante tener en el formulario.En cuanto a su
php.ini
configuración, a veces en los sistemasphp.ini
existen múltiples archivos. Asegúrese de estar editando el correcto. Sé que dijiste que configuraste tuphp.ini
archivo para cargar archivos, pero ¿también configurasteupload_max_filesize
ypost_max_size
ser más grande que el archivo que estás intentando cargar? Entonces deberías tener:¿Su directorio:
"c:\wamp\tmp"
tiene permisos de lectura y escritura? ¿Recordó reiniciar Apache después de realizar losphp.ini
cambios?fuente
Es importante agregar
enctype="multipart/form-data"
a su formulario, ejemplofuente
Gracias a todos por las variadas respuestas integrales. Esos son todos muy útiles. La respuesta resultó ser algo muy extraño. Resulta que PHP 5.2.11 no le gusta lo siguiente:
o
Si lo cambio a
2047M
, la carga funciona.fuente
Tengo el mismo problema buscando 2 horas, es muy simple verificar primero la configuración de nuestro servidor.
Ejemplo:
cualquier tipo de tamaño de archivo es
:20mb
, pero nuestroupload_max_size
está arriba20mb
pero la matriz esnull
. La respuesta es nuestrapost_max_size
debería ser mayor queupload_max_filesize
fuente
Aquí otra causa que encontré: Al usar JQuery Mobile y el atributo de formulario data-ajax está establecido en verdadero, la matriz de ARCHIVOS estará vacía. Establezca data-ajax en falso.
fuente
Asegúrese de que su elemento de entrada tenga un atributo 'nombre'.
<input type="file" name="uploadedfile" />
Si esto falta, los $ _FILES estarán vacíos.
fuente
Estaba luchando con el mismo problema y probando todo, sin obtener informes de errores y nada parecía estar mal. Tuve error_reporting (E_ALL) Pero de repente me di cuenta de que no había revisado el registro de apache y ¡voilà! ¡Hubo un error de sintaxis en el script ...! (falta un "}")
Entonces, aunque esto es algo evidente para verificar, puede olvidarse ... En mi caso (Linux) es en:
fuente
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:
Tendrá que consultar con su webhost si quiere que use una ruta absoluta de archivo del servidor. Debería poder ver otros ejemplos de directorio en su archivo php.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 los archivos tengan los permisos correctos para que puedan leerse y escribirse en ellos.
fuente
Si usted está tratando de subir una serie de archivos entonces es posible que tenga que aumentar
max_file_uploads
en elphp.ini
que está junto al conjunto predeterminado20
Nota :
max_file_uploads
NO se puede cambiar fuera de php.ini. Ver PHP "Bug" # 50684fuente
Otro posible culpable es el redireccionamiento de apache. En mi caso, configuré httpd.conf de apache 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. Por lo tanto, la página enviaría la carga a la versión SSL de la página de acción, pero Apache la estaba redirigiendo a la versión http de la página y se perdieron los datos de publicación, incluido el archivo cargado.
fuente
Verifique su php.ini para enable_post_data_reading = On , porque:
En http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading
fuente
Si su script principal es
http://Some_long_URL/index.php
cuidadoso, especifique la URL completa (con explícitoindex.php
y no solohttp://Some_long_URL
) en elaction
campo. Sorprendentemente, si no, se ejecuta el script correcto, ¡pero con $ _FILES en vacío!fuente
Me encontré con el mismo problema y descubrí que era mi IDE parte del problema. Estaba iniciando el depurador directamente desde el IDE (PHPStorm) en lugar de simplemente usar el navegador directamente. La URL generada por IDE era así:
y solo usando:
funcionó bien. Mi configuración es PC / Windows 10 / WAMPSERVER 3.0.6 64bit
fuente
No confíe en la ubicación de la carpeta temporal proporcionada por
sys_get_temp_dir
si está en un entorno de alojamiento compartido.Aquí hay una cosa más para verificar que aún no se ha mencionado ...
Supuse, naturalmente, que la carpeta donde mi script PHP almacenaba las cargas de archivos temporales era
/tmp
. Esta creencia fue reforzada por el hecho de queecho sys_get_temp_dir() . PHP_EOL;
regresa/tmp
. También,echo ini_get('upload_tmp_dir');
no devuelve nada.Para verificar que el archivo cargado aparece de hecho brevemente en mi
/tmp
carpeta, agregué unasleep(30);
declaración a mi script (como se sugiere aquí ) y navegué a mi/tmp
carpeta en el Administrador de archivos de cPanel para ubicar el archivo. Sin embargo, no importa qué, el archivo cargado no se encontraba en ninguna parte.Pasé horas tratando de determinar la razón de esto, e implementé todas las sugerencias que se ofrecen aquí.
Finalmente, después de buscar la consulta en los archivos de mi sitio web
tmp
, descubrí que mi sitio contenía otras carpetas nombradastmp
en diferentes directorios. Me di cuenta de que mi script PHP en realidad estaba escribiendo los archivos cargados.cagefs/tmp
. (El "Mostrar archivos ocultos" configuración debe estar habilitada en cPanel para ver esta carpeta).Entonces, ¿por qué la
sys_get_temp_dir
función devuelve información inexacta?Aquí hay una explicación de la página web PHP.net para
sys_get_temp_dir
(es decir, el comentario principal):Esta publicación SO también profundiza en el problema:
fuente
Tengo el mismo problema y ninguno de tema fue mi error. Revise su archivo .htaccess, si tiene uno, si "MultiViews" están habilitados. Tuve que desactivarlos.
fuente
Tuve un problema similar y el problema tenía un valor incorrecto en htaccess como se mencionó en shamittomar.
Cambiar
php_value post_max_size 10MB
aphp_value post_max_size 10M
fuente
Estaba vacío
$_FILES
porque después de<form enctype="multipart/form-data" method="post">
colocarEl código inicial fue como
Decidí modificar y
Entonces, la conclusión es que after
<form enctype="multipart/form-data" method="post">
debe ser<input name, type, id
y no debe ser<div>
o algunas otras etiquetasEn mi situación, el código correcto era
fuente
Yo también tuve problemas con $ _FILES vacío. La lista de verificación anterior no menciona MultiViews en .htaccess, httpd.conf o httpd-vhost.conf.
Si tiene MultiViews establecido en la directiva de opciones para su directorio que contiene el sitio web, $ _FILES estará vacío, aunque el encabezado Content-Length si muestra que el archivo lo he subido.
fuente
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 principal con data-ajax = "false" para asegurarse de que el formulario se envíe correctamente al servidor.
fuente
Separe su formulario de la página que está utilizando en una página php simple que solo tiene el formulario y el código php, y pruébelo así.
Cualquier secuencia de comandos de arranque o Java podría limpiar el _FILES []. Ese fue mi caso
fuente