J'ai WampServer 2 installé sur mon ordinateur Windows 7. J'utilise Apache 2.2.11 et PHP 5.2.11. Lorsque j'essaye de télécharger un fichier à partir d'un formulaire, il semble télécharger, mais en PHP, le $_FILES
tableau est vide. Il n'y a aucun fichier dans le c:\wamp\tmp
dossier. J'ai configuré php.ini
pour autoriser les téléchargements de fichiers et autres. Le tmp
dossier dispose de privilèges de lecture / écriture pour l'utilisateur actuel. Je suis perplexe.
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
la source
la source
vanilla-upload.php
?Réponses:
Voici une liste de contrôle pour le téléchargement de fichiers en PHP:
Vérifiez php.ini pour:
file_uploads = On
post_max_size = 100M
upload_max_filesize = 100M
.htaccess
ou.user.ini
si vous êtes sur un hébergement partagé et n'avez pas accès àphp.ini
.phpinfo()
fonction pour vérifier que vos paramètres sont effectivement appliqués.100M
pas être le cas100MB
.Assurez-vous que votre
<form>
balise possède l'enctype="multipart/form-data"
attribut. Aucune autre balise ne fonctionnera, il doit s'agir de votre balise FORM. Vérifiez qu'il est correctement orthographié . Vérifiez que les données multipart / form sont entourées de guillemets droits, et non de guillemets intelligents collés à partir de Word OU d'un blog de site Web (WordPress convertit les guillemets droits en guillemets angulaires!). Si vous avez plusieurs formulaires sur la page, assurez-vous qu'ils ont tous les deux cet attribut. Saisissez-les manuellement ou essayez les guillemets simples saisis manuellement.Assurez-vous que vous n'avez pas deux champs de fichier d'entrée avec le même
name
attribut. Si vous avez besoin de prendre en charge plusieurs, mettez des crochets à la fin du nom:Assurez-vous que vos répertoires tmp et upload disposent des autorisations de lecture et d'écriture correctes. Le dossier de téléchargement temporaire est spécifié dans les paramètres PHP comme
upload_tmp_dir
.Assurez-vous que vos répertoires de destination de fichier et tmp / upload ne contiennent pas d'espaces.
Assurez-vous que tous
<form>
les éléments de votre page comportent</form>
des balises proches.Assurez-vous que votre balise FORM a
method="POST"
. Les requêtes GET ne prennent pas en charge les téléchargements de données en plusieurs parties / formulaire.Assurez-vous que votre balise d'entrée de fichier a un attribut NAME. Un attribut ID n'est PAS suffisant! Les attributs ID sont à utiliser dans le DOM, pas pour les charges utiles POST.
Assurez-vous que vous n'utilisez pas Javascript pour désactiver votre
<input type="file">
champ lors de la soumissionAssurez-vous de ne pas imbriquer des formulaires comme
<form><form></form></form>
Vérifiez votre structure HTML pour les balises non valides / qui se chevauchent comme
<div><form></div></form>
Assurez-vous également que le fichier que vous téléchargez ne contient aucun caractère non alphanumérique.
Une fois, je viens de passer des heures à essayer de comprendre pourquoi cela m'arrivait tout d'un coup. Il s'est avéré que j'avais modifié certains des paramètres PHP dans
.htaccess
, et l'un d'entre eux ( je ne sais pas encore lequel) provoquait l'échec du téléchargement et$_FILES
le vidage.Vous pouvez potentiellement essayer d'éviter les traits de soulignement (
_
) dans l'name=""
attribut de la<input>
baliseEssayez de télécharger de très petits fichiers pour déterminer s'il s'agit d'un problème de taille de fichier.
Vérifiez votre espace disque disponible. Bien que très rare, il est mentionné dans ce commentaire de page de manuel PHP :
Assurez-vous que vous ne soumettez pas le formulaire via une requête AJAX POST au lieu d'une requête POST normale qui provoque le rechargement d'une page. J'ai parcouru chaque point de la liste ci-dessus et j'ai finalement découvert que la raison pour laquelle ma variable $ _FILES était vide était que je soumettais le formulaire en utilisant une requête AJAX POST. Je sais qu'il existe également des méthodes pour télécharger des fichiers en utilisant ajax, mais cela pourrait être une raison valable pour laquelle votre tableau $ _FILES est vide.
Source pour certains de ces points:
http://getluky.net/2004/10/04/apachephp-_files-array-mysterously-empty/
la source
<form><form><input type="file"></form></form>
$('#my-form')[0].reset();
le gestionnaire de soumission.En ce qui concerne le HTML, vous semblez avoir configuré cette partie correctement. Vous avez déjà le
enctype="multipart/form-data"
qui est très important d'avoir sur le formulaire.En ce qui concerne votre
php.ini
configuration, ilphp.ini
existe parfois sur les systèmes plusieurs fichiers. Assurez-vous que vous modifiez le bon. Je sais que vous avez dit que vous avez configuré votrephp.ini
fichier pour avoir des téléchargements de fichiers, mais avez-vous également défini votreupload_max_filesize
etpost_max_size
pour qu'il soit plus grand que le fichier que vous essayez de télécharger? Vous devriez donc avoir:Votre répertoire:
"c:\wamp\tmp"
dispose-t-il des autorisations de lecture et d'écriture? Avez-vous pensé à redémarrer Apache après avoir effectué lesphp.ini
modifications?la source
Il est important d'ajouter
enctype="multipart/form-data"
à votre formulaire, exemplela source
Merci à tous pour les réponses variées et complètes. Tout cela est très utile. La réponse s'est avérée être quelque chose de très étrange. Il s'avère que PHP 5.2.11 n'aime pas ce qui suit:
ou
Si je le change en
2047M
, le téléchargement fonctionne.la source
J'ai un même problème en regardant 2 heures, c'est très simple de vérifier d'abord la configuration de notre serveur.
Exemple:
tout type de taille de fichier l'est
:20mb
, mais notreupload_max_size
est au-dessus20mb
mais le tableau l'estnull
. La réponse est que notrepost_max_size
devrait être supérieur àupload_max_filesize
la source
Voici une autre cause que j'ai trouvée: lorsque vous utilisez JQuery Mobile et que l'attribut de formulaire data-ajax est défini sur true, le tableau FILES sera vide. Définissez donc data-ajax sur false.
la source
Assurez-vous que votre élément d'entrée a un attribut «nom».
<input type="file" name="uploadedfile" />
Si cela manque, $ _FILES sera vide.
la source
Je luttais avec le même problème et je testais tout, je n'obtenais pas de rapport d'erreur et rien ne semblait aller de travers. J'ai eu error_reporting (E_ALL) Mais du coup j'ai réalisé que je n'avais pas vérifié le journal Apache et voilà! Il y a eu une erreur de syntaxe sur le script ...! (un "}" manquant)
Donc, même si c'est quelque chose d'évident à vérifier, on peut l'oublier ... Dans mon cas (linux) c'est à:
la source
Personne n'a mentionné cela, mais cela m'a aidé et peu d'endroits sur le net le mentionnent.
Assurez-vous que votre php.ini définit la clé suivante:
Vous devrez vérifier auprès de votre hébergeur s'il souhaite que vous utilisiez un chemin de fichier serveur absolu. Vous devriez pouvoir voir d'autres exemples de répertoires dans votre fichier php.ini pour le déterminer. Dès que je l'ai défini, j'ai des valeurs dans mon objet _FILES.
Enfin, assurez-vous que votre dossier tmp et l'endroit où vous déplacez des fichiers disposent des autorisations appropriées afin qu'ils puissent être lus et écrits.
la source
Si vous essayez de télécharger un tableau de fichiers, vous devrez peut - être augmenter
max_file_uploads
dans cephp.ini
qui est par défaut ensemble20
Remarque :
max_file_uploads
ne peut PAS être modifié en dehors de php.ini. Voir le "bogue" PHP # 50684la source
Les redirections Apache sont un autre coupable possible. Dans mon cas, j'ai configuré httpd.conf d'apache pour rediriger certaines pages de notre site vers des versions http, et d'autres pages vers des versions https de la page, si elles ne l'étaient pas déjà. La page sur laquelle j'avais un formulaire avec une entrée de fichier était l'une des pages configurées pour forcer ssl, mais la page désignée comme l'action du formulaire était configurée pour être http. Ainsi, la page soumettrait le téléchargement à la version ssl de la page d'action, mais Apache le redirigeait vers la version http de la page et les données de publication, y compris le fichier téléchargé, étaient perdues.
la source
Vérifiez votre php.ini pour enable_post_data_reading = On , car:
Dans http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading
la source
Si votre script principal est
http://Some_long_URL/index.php
attentif à spécifier l'URL complète (avec expliciteindex.php
et pas seulementhttp://Some_long_URL
) dans leaction
champ. Étonnamment, sinon, le bon script est exécuté, mais avec en vide $ _FILES!la source
J'ai rencontré le même problème et j'ai découvert que mon IDE faisait partie du problème. Je lançais le débogueur directement depuis l'IDE (PHPStorm) au lieu d'utiliser simplement le navigateur directement. L'URL générée par l'EDI était comme ceci:
et en utilisant simplement:
a très bien fonctionné. Ma configuration est PC / Windows 10 / WAMPSERVER 3.0.6 64 bits
la source
Ne faites pas confiance à l'emplacement du dossier temporaire fourni par
sys_get_temp_dir
si vous êtes dans un environnement d'hébergement partagé.Voici encore une chose à vérifier qui n'a pas encore été mentionnée ...
J'ai supposé, naturellement, que le dossier où mon script PHP stockait les téléchargements de fichiers temporaires était
/tmp
. Cette croyance a été renforcée par le fait que lesecho sys_get_temp_dir() . PHP_EOL;
rendements/tmp
. En outre,echo ini_get('upload_tmp_dir');
ne retourne rien.Pour vérifier que le fichier téléchargé apparaît en fait brièvement dans mon
/tmp
dossier, j'ai ajouté unesleep(30);
déclaration à mon script (comme suggéré ici ) et ai navigué vers mon/tmp
dossier dans cPanel File Manager pour localiser le fichier. Cependant, quoi qu'il arrive, le fichier téléchargé ne s'y trouvait nulle part.J'ai passé des heures à essayer de déterminer la raison de cela et à mettre en œuvre toutes les suggestions proposées ici.
Enfin, après avoir recherché les fichiers de mon site Web pour la requête
tmp
, j'ai découvert que mon site contenait d'autres dossiers nomméstmp
dans différents répertoires. J'ai réalisé que mon script PHP écrivait en fait les fichiers téléchargés.cagefs/tmp
. (Le paramètre «Afficher les fichiers cachés» doit être activé dans cPanel pour afficher ce dossier.)Alors, pourquoi la
sys_get_temp_dir
fonction renvoie-t-elle des informations inexactes?Voici une explication de la page Web PHP.net pour
sys_get_temp_dir
(c'est-à-dire le commentaire principal):Cet article SO approfondit également le problème:
la source
J'ai eu le même problème et aucun thème n'était mon erreur. Archivez votre fichier .htaccess, si vous en avez un, si "MultiViews" est activé. J'ai dû les désactiver.
la source
J'ai eu un problème similaire et le problème était de mauvaise valeur dans htaccess, comme l'a mentionné shamittomar.
Changer
php_value post_max_size 10MB
pourphp_value post_max_size 10M
la source
J'étais vide
$_FILES
parce qu'après avoir<form enctype="multipart/form-data" method="post">
placéLe code initial était comme
J'ai décidé de modifier et
La conclusion est donc qu'après
<form enctype="multipart/form-data" method="post">
doit être<input name, type, id
et ne doit pas être<div>
ou d'autres balisesDans ma situation, le code correct était
la source
J'ai aussi eu des problèmes avec $ _FILES empty. La check-list ci-dessus ne mentionne pas MultiViews dans .htaccess, httpd.conf ou httpd-vhost.conf.
Si vous avez défini MultiViews dans la directive options pour votre répertoire contenant le site Web, $ _FILES sera vide, même si l'en-tête Content-Length indique que le fichier a été téléchargé.
la source
Si vous utilisez JQuery Mobile
L'utilisation d'un formulaire en plusieurs parties avec une entrée de fichier n'est pas prise en charge par Ajax. Dans ce cas, vous devez décorer le formulaire parent avec data-ajax = "false" pour vous assurer que le formulaire est correctement soumis au serveur.
la source
Détachez votre formulaire de la page que vous utilisez dans une simple page php qui n'a que le formulaire et le code php, et testez-le comme ça.
Tout script d'amorçage ou java peut nettoyer le _FILES []. C'était mon cas
la source