2009-02-25 11 views
1

J'ai un problème vraiment ennuyeux avec les téléchargements de fichiers.Problème de téléchargement de fichier PHP

Les utilisateurs peuvent choisir un fichier dans un champ de fichier html. Quand ils soumettent le formulaire, ce fichier sera téléchargé.

Sur le côté serveur, j'utilise simplement du code PHP standard (move_uploaded_file). Je ne fais rien de bizarre.

Tout fonctionne parfaitement.

Je peux voir le fichier sur le serveur, je peux le télécharger à nouveau, ...

Cependant parfois cela ne fonctionne pas. Je télécharge le fichier, le traite et je n'obtiens aucune erreur.

Mais le fichier n'existe tout simplement pas sur le serveur.

Chaque fois que je télécharge ce fichier spécifique, je ne reçois aucune erreur, mais il n'est jamais enregistré. Ce n'est que si je le renommer (test.file en tst.file par exemple) que je peux le télécharger et qu'il sera effectivement sauvegardé.

Je rencontre très rarement ce problème. Et renommer fonctionne toujours. Mais je ne peux pas demander aux utilisateurs de renommer leurs fichiers de toute évidence ...

Je n'ai pas accès au répertoire de fichiers apache tmp, pas d'accès aux journaux ou aux paramètres, ce qui rend le débogage encore plus difficile. J'ai seulement ce problème sur ce serveur particulier (que je ne gère pas, je n'ai même pas accès à celui-ci) et j'utilise exactement le même code sur beaucoup de serveurs qui n'ont pas ce problème.

Je serais reconnaissant si quelqu'un pouvait m'aider ici ou me diriger dans la bonne direction.

+0

Vous pourriez supprimer le fichier dans une autre partie de votre code –

Répondre

1

Si un téléchargement échoue vous ne recevez pas le même type d'erreur comme une erreur de syntaxe PHP ou autre.

Mais vous pouvez vérifier le file upload status et rapporter l'erreur à l'utilisateur vous-même.

+0

état de téléchargement est 0, ce qui signifie que le fichier aurait été téléchargé correctement. Le problème peut être un problème de serveur et non un problème PHP. –

2

Essayant ajoutant ce code de débogage:

echo '<pre>'; 
print_r($_FILES); 
echo '</pre>'; 

Vous devriez voir un numéro d'erreur. Vous pouvez rechercher ce que cela signifie à http://uk3.php.net/manual/en/features.file-upload.errors.php

Il peut également être intéressant de vérifier que le fichier de destination n'existe pas déjà.

+0

Le statut de téléchargement est 0, ce qui signifie que le fichier doit avoir été téléchargé correctement. Le fichier de destination n'existe pas non plus. Tout fonctionne comme il se doit, je ne reçois aucune erreur mais le fichier n'existe tout simplement pas. –

2

Ma première pensée a été les problèmes de fichiers. Dans le fichier php.ini, si post_max_size ou upload_max_filesize sont trop petits, vous pouvez obtenir des résultats similaires: le fichier semble juste disparaître. Vous obtiendriez une erreur dans les journaux Apache (dont vous mentionnez que vous n'avez pas accès).

Dans ces cas, le tableau $ _FILES serait simplement vide - comme si le fichier n'était jamais arrivé. Depuis vos réponses à Gumbo et James Hall montrent que php rapporte un téléchargement approprié, je suis amené à s'interroger sur le traitement que vous mentionnez.

Si, au cours du processus, votre mémoire est maximisée ou si le script s'exécute trop longtemps, le script risque de s'éteindre avant de pouvoir être déplacé.Vous voulez vérifier ces:

memory_limit

max_execution_time

max_input_time

Sinon, sans les journaux apache, je dirais que ce pourrait être une bonne idée de commencer à produire un journal fichier de votre propre tout au long de votre script de traitement de fichiers. Essayez un fichier_exists sur le fichier tmp, voir quelles informations vous pouvez obtenir à partir du fichier (autorisations, etc).

Malheureusement, PHP n'intervient pas tant que le téléchargement n'est pas terminé, ce qui signifie que vous ne recevrez pas beaucoup d'informations pendant - seulement après le fait. Votre meilleure option pourrait être de parler à la société d'hébergement et avoir accès aux journaux - même si pour une courte période. Dans mon expérience, j'ai rarement eu du mal à obtenir les journaux - ou au moins obtenir une technologie pour vérifier les journaux pendant que je cours des tests (dans le cas où un serveur partagé ne divise pas leurs journaux - semble ridicule, mais Je l'ai déjà vu). Edit: Je me rends compte que vous ne pouvez pas modifier ces paramètres PHP, mais vous voudrez peut-être voir ce qu'ils sont afin de savoir si elles sont des problèmes potentiels pour votre script. Par exemple, une limite de mémoire basse va tuer votre script de processeur si elle est inférieure à la taille du fichier téléchargé.

+0

Je suis d'accord, il devrait vérifier définitivement vérifier la taille maximale que le navigateur ne téléchargera rien si le fichier est plus grand que la taille maximale. – dusoft

1

Ce que vous avez dit ...

«J'ai pas accès au répertoire de fichiers tmp apache, pas d'accès aux journaux ou paramètres de sorte ce qui rend le débogage encore plus difficile. Je n'ai que ce problème sur ce serveur (que je ne gère pas, je n'y ai même pas accès) et j'utilise exactement le même code sur beaucoup de serveurs qui n'ont pas ce problème. "

Selon ce que vous avez dit ci-dessus, je suppose que vous utilisez un serveur partagé entre plusieurs utilisateurs. Si l'Apache de ce serveur est configuré avec quelque chose comme "mod_suphp", alors vos scripts PHP seront exécutés en utilisant les privilèges de votre compte utilisateur UNIX ("jef1234", par exemple), ce qui signifie que les fichiers que vous créerez (" jef1234 ") en tant que propriétaire (au lieu de" apache "ou" www-data ").

Le répertoire temporaire du système (généralement "/ tmp") est généralement configuré avec le "bit collant" activé. Cela signifie que tout le monde peut créer des fichiers dans ce répertoire, mais les fichiers créés ne sont accessibles que par le propriétaire (vous pouvez considérer cela comme celui qui l'a créé). Par conséquent, si la configuration du serveur n'est pas assez prudente, vous pouvez avoir des conflits de noms de fichiers avec les fichiers d'autres utilisateurs. Par exemple, lorsque vous téléchargez "test.file", si un autre utilisateur a déjà téléchargé un autre fichier portant le même nom, le système refuse d'écraser le fichier créé par lui, vous devez donc utiliser un autre nom.

Habituellement, le problème n'existe pas car PHP est suffisamment intelligent pour générer des noms temporaires pour le fichier téléchargé (par exemple $ _FILES ["html_form_input_name"] ["tmp_name"]). Si d'une manière ou d'une autre vous pouvez confirmer que c'est vraiment la raison, le serveur est évidemment mal configuré. Dites à votre administrateur système le problème en lui demandant de le résoudre. Si cela n'a pas pu être résolu, vous pouvez faire quelques astuces JavaScript sur le nom du fichier avant qu'il ne soit téléchargé (pas testé, juste une idée) ...

Lorsque l'utilisateur soumet le formulaire, renommez le fichier de, par exemple, "test.file" à "jef1234-test.file-jef1234". Une fois le fichier téléchargé, déplacez le fichier (c.-à-d. move_uploaded_file()) vers un autre endroit et renommez-le en supprimant les chaînes ajoutées.

Espérons que cela aide ...

Asuka Kenji

Questions connexes