155 votes

Pourquoi $_FILES serait-il vide lors du téléchargement de fichiers vers PHP ?

J'ai installé WampServer 2 sur mon ordinateur Windows 7. J'utilise Apache 2.2.11 et PHP 5.2.11. Lorsque j'essaie de télécharger un fichier à partir d'un formulaire, il semble télécharger, mais en PHP, l'icône $_FILES est vide. Il n'y a pas de fichier dans le c:\wamp\tmp dossier. J'ai configuré php.ini pour permettre le téléchargement de fichiers et autres. Le site tmp a des privilèges de lecture/écriture pour l'utilisateur actuel. Je ne sais pas quoi faire.

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";
?>

2 votes

Avez-vous vérifié les journaux d'erreurs ?

0 votes

Je suis sûr qu'il y a quelque chose de stupide que tu négliges. Par exemple, êtes-vous sûr d'avoir le code dans vanilla-upload.php ?

0 votes

Ha, j'avais le même problème. J'ai vérifié les journaux d'erreurs et il a été dit qu'un fichier était téléchargé qui dépassait la taille maximale autorisée.

538voto

shamittomar Points 20136

Voici une liste de contrôle pour le téléchargement de fichiers en PHP :

  1. Vérifiez le php.ini pour :
    file_uploads = On
    post_max_size = 100M
    upload_max_filesize = 100M
  • Vous devrez peut-être utiliser .htaccess ou .user.ini si vous êtes sur un hébergement mutualisé et que vous n'avez pas accès à php.ini .
  • Assurez-vous que vous éditez le bon fichier ini. utilisez le phpinfo() fonction pour vérifier que vos paramètres sont effectivement appliqués.
  • Assurez-vous également de ne pas mal orthographier les tailles - cela devrait être 100M pas 100MB .
  1. Assurez-vous que votre <form> a la balise enctype="multipart/form-data" attribut. Aucune autre balise ne fonctionnera, il doit s'agir de votre balise FORM. Vérifiez que c'est orthographié correctement . Vérifiez que les données multipart/form-data sont entourées de guillemets droits, et non de guillemets intelligents collés à partir de Word ou d'un blog (WordPress convertit les guillemets droits en guillemets anglais). Si vous avez plusieurs formulaires sur la page, assurez-vous qu'ils ont tous deux cet attribut. Tapez-les manuellement, ou essayez les guillemets simples droits tapés manuellement.

  2. Assurez-vous que vous n'avez pas deux champs du fichier d'entrée avec le même nom. name attribut. Si vous devez prendre en charge plusieurs attributs, mettez des crochets à la fin du nom :

    <input type="file" name="files[]">
    <input type="file" name="files[]">
  3. Assurez-vous que vos répertoires tmp et upload ont les bonnes permissions de lecture et d'écriture. Le dossier de téléchargement temporaire est spécifié dans les paramètres PHP comme suit upload_tmp_dir .

  4. Assurez-vous que vos répertoires de destination des fichiers et tmp/upload ne comportent pas ne contiennent pas d'espaces.

  5. Assurez-vous que tous les <form> sur votre page ont </form> fermer les étiquettes.

  6. Assurez-vous que votre balise FORM a method="POST" . Les demandes GET ne prennent pas en charge les téléchargements multipart/form-data.

  7. Assurez-vous que votre balise d'entrée de fichier possède un attribut NAME. Un attribut ID n'est PAS suffisant ! Les attributs ID sont destinés à être utilisés dans le DOM, pas pour les charges utiles POST.

  8. Assurez-vous que vous n'utilisez pas le Javascript pour désactiver votre <input type="file"> champ sur la soumission

  9. Assurez-vous que vous n'imbriquez pas des formulaires tels que <form><form></form></form>

  10. Vérifiez que votre structure HTML ne contient pas de balises invalides ou superposées comme <div><form></div></form>

  11. Assurez-vous également que le fichier que vous téléchargez ne contient pas de caractères non alphanumériques.

  12. Une fois, j'ai passé des heures à essayer de comprendre pourquoi ça m'arrivait tout d'un coup. Il s'est avéré que j'avais modifié certains des paramètres PHP dans le fichier .htaccess et l'un d'entre eux (je ne sais pas encore lequel) faisait échouer le téléchargement et $_FILES pour être vide.

  13. Vous pouvez éventuellement essayer d'éviter les caractères de soulignement ( _ ) dans le name="" de l'attribut <input> étiquette

  14. Essayez de télécharger de très petits fichiers pour déterminer s'il s'agit d'un problème de taille de fichier.

  15. Vérifiez votre espace disque disponible. Bien que très rare, il est mentionné dans ce Commentaire de page du manuel PHP :

    Si le tableau $_FILES devient soudain mystérieusement vide, alors que votre formulaire semble correct, vous devez vérifier l'espace disque disponible pour votre partition de dossiers temporaires. Dans mon installation, tous les téléchargements de fichiers ont échoué sans avertissement. Après de nombreux grincements de dents, j'ai essayé de libérer de l'espace supplémentaire, après quoi les téléchargements de fichiers ont soudainement fonctionné à nouveau.

  16. Assurez-vous que vous ne soumettez pas le formulaire par le biais d'une requête POST AJAX au lieu d'une requête POST normale qui entraîne le rechargement de la page. J'ai passé en revue 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 POST AJAX. Je sais qu'il existe des méthodes pour télécharger des fichiers en utilisant ajax également, mais cela pourrait être une raison valable pour laquelle votre tableau $_FILES est vide.

_Source pour certains de ces points :
https://web.archive.org/web/20050426084124/http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/_

1 votes

Cela ne s'applique pas à la discussion en cours, mais j'avais un fournisseur d'hébergement dont la politique de pare-feu était trop stricte, ce qui faisait échouer certains téléchargements.

17 votes

Peut-être que la réponse "acceptée" a résolu le message original, mais cette réponse est celle que j'ai trouvée la plus utile. En cas de doute, regardez la source telle qu'elle est vue par le navigateur. En cochant chaque élément de cette liste et en remontant le temps, j'ai trouvé mon erreur à un endroit tout à fait inattendu. Si vous rencontrez un problème similaire, croyez-moi, il ne s'agit probablement pas d'un bogue dans Apache ;)

0 votes

"N'utilisez pas de javascript pour désactiver le champ de saisie de votre fichier de formulaire lors de la soumission du formulaire !" --agh ! vous m'avez eu ! Merci. On passe au numéro 1 ?

78voto

Brian Points 456

En ce qui concerne le HTML, vous semblez avoir configuré cette partie correctement. Vous avez déjà le enctype="multipart/form-data" qu'il est très important d'avoir sur le formulaire.

En ce qui concerne votre php.ini parfois sur des systèmes multiples php.ini existent. Assurez-vous que vous éditez le bon. Je sais que vous avez dit que vous avez configuré votre php.ini pour avoir des téléchargements de fichiers, mais avez-vous également configuré votre fichier upload_max_filesize et post_max_size pour être plus grand que le fichier que vous essayez de télécharger ? Donc vous devriez avoir :

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

Est-ce que votre répertoire : "c:\wamp\tmp" a les droits de lecture et d'écriture ? N'avez-vous pas pensé à redémarrer Apache après avoir effectué les modifications de l'application php.ini des changements ?


4 votes

+1 : Pour le conseil de redémarrage du serveur Apache. De nombreux utilisateurs de Windows l'oublient.

14voto

elmonty Points 423

Merci à tous pour ces réponses très complètes. Elles sont toutes très utiles. 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 :

post_max_size = 2G

ou

post_max_size = 2048M

Si je le change en 2047M le téléchargement fonctionne.

18 votes

Notez qu'une valeur aussi élevée est une vulnérabilité aux attaques de type out-of-space/ddos. J'ajoute simplement ceci pour que les gens soient conscients que c'est trop, lorsqu'ils essaient de copier/coller votre solution. Quoi qu'il en soit, 2 gigas nécessiteraient un temps de téléchargement beaucoup trop long.

1 votes

Il n'est plus trop grand. Nous avons des clients qui téléchargent des fichiers de l'ordre de 1 à 3G assez régulièrement. Étant donné qu'ils téléchargent des fichiers sur leurs propres serveurs, et qu'il s'agit de serveurs à liste blanche d'adresses IP, l'échange est tout à fait normal et constitue simplement un moyen de permettre à un client d'utiliser son équipement comme il l'entend. Ils paient les factures, aucun risque de sécurité n'est impliqué, aucun problème.

6voto

user998066 Points 163

Voici une autre cause que j'ai trouvée : Lorsque vous utilisez JQuery Mobile et que l'attribut data-ajax du formulaire est défini sur true, le tableau FILES est vide. Il faut donc définir data-ajax à false.

2voto

user2723315 Points 1

Un autre coupable possible est les redirections apache. Dans mon cas, le fichier httpd.conf d'Apache était configuré pour rediriger certaines pages de notre site vers des versions http, et d'autres pages vers des versions https de la page, si ce n'était pas déjà le cas. La page sur laquelle j'avais un formulaire avec une entrée de fichier était l'une des pages configurées pour forcer le ssl, mais la page désignée comme l'action du formulaire était configurée pour être http. La page soumettait donc le téléchargement à la version ssl de la page d'action, mais Apache la redirigeait vers la version http de la page et les données du message, y compris le fichier téléchargé, étaient perdues.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X