2008-12-11 10 views
0

J'ai un problème extrêmement étrange avec un de mes scripts PHP.Problème de téléchargement de fichier PHP

Je télécharge un couple de fichiers et PHP les a mis tous dans un dossier. J'ai des problèmes avec l'envoi de fichiers aléatoires et l'envoi de fichiers aléatoires. Donc je l'ai débogué et j'ai obtenu un résultat très étrange du tableau $ _FILES [].

Je l'ai essayé avec 3 fichiers.

$_FILES["addFile"]["name"] Contient les noms des 3 fichiers.

Vous attendez $_FILES["addFile"]["tmp_name"] pour contenir les 3 noms temporaires que PHP utilise pour copier les fichiers, mais ce n'est pas le cas. Il ne tient qu'un seul nom. Les 2 autres sont des chaînes vides, qui génèrent une erreur lors du téléchargement (que je supprime de l'affichage)

Ceci est très étrange. J'ai essayé plusieurs situations et cela continue à se produire. Cela doit être quelque chose dans mes paramètres ou peut-être même mon code.

Voici mon code:

$i = 0; 
    if (!empty($_FILES['addFile'])) { 
    foreach($_FILES['addFile'] as $addFile) { 
     $fileToCopy = $_FILES["addFile"]["tmp_name"][$i]; 
     $fileName = $_FILES["addFile"]["name"][$i]; 
     $i++; 
     if(!empty($fileToCopy)){ 
     $copyTo = $baseDir."/".$fileName; 
     @copy($fileToCopy, $copyTo) or die("cannot copy ".$fileToCopy." to ".$copyTo); 
     } 
    } 
      exit(0); 
    } 

Depuis le tmp_name est vide, si la valeur sera faux donc il va sauter la fonction die().

Est-ce que quelqu'un sait ce qui pourrait causer cela?

plus d'informations: J'utilise Windows XP, en exécutant le serveur WAMP. Jamais eu ce problème avant et je peux accéder à toutes les cartes à partir de laquelle j'ai essayé de télécharger. Les paramètres de sécurité des fenêtres ne peuvent pas être le problème je pense.

Répondre

1

Relevent, mais ne va probablement pas aider: mais move_uploaded_file est une (légèrement) meilleure façon de gérer les fichiers téléchargés que de les copier.

L'un des fichiers est-il volumineux? PHP a des limites sur la taille du fichier et le temps qu'il peut prendre pour les télécharger ...

Mieux vaut vous envoyer ici que d'essayer d'écrire ce qu'il dit:

http://uk3.php.net/manual/en/features.file-upload.common-pitfalls.php

+0

Il était en effet la limite de taille de fichier qui l'a fait pour moi. Cursus, je vais devoir chercher comment surmonter cela. – Vordreller

+0

Je veux dire "malédictions" – Vordreller

+0

Vous devez éditer le fichier php.ini et le changer. – benlumley

1

Votre logique de boucle est incorrect . Vous utilisez directement une boucle foreach sur le nom d'entrée du fichier, qui stocke plusieurs propriétés qui ne vous intéressent pas ('type', 'size', etc.).

Vous devriez obtenir le nombre de fichiers à partir du premier fichier et l'utiliser comme la longueur de boucle:

if (!empty($_FILES['addFile']) && is_array($_FILES['addFile']['name'])) { 
    $length = count($_FILES['addFile']['name']); 
    for($i = 0; $i < $length; $i++) { 
     $result = move_uploaded_file($_FILES['addFile']['tmp_name'][$i],$baseDir."/" . $_FILES['addFile']['name'][$i]); 
     if($result === false) { 
      echo 'File upload failed. The following error has occurred: ' . $_FILES['addFile']['error'][$i]; 
     } 
    } 
} 

Vérifiez le code d'erreur si vous rencontrez encore des problèmes, il doit fournir toutes les informations dont vous avez besoin pour déboguer il.

3

Je suis désolé mais il me semble que vous essayez de télécharger tous les 3 fichiers avec le même nom de variable? Est-ce correct? Mais cela ne fonctionnera pas car ils se remplaceront mutuellement. Je pense que la meilleure façon plus propre serait d'utiliser quelque chose comme

$i = 0; 
    foreach($_FILES['addFile'.$i] as $addFile) { 
    if(!empty($addFiles) { 
     move_uploaded_file($addFile['temp_name'], 'YOUR DIRECTORY'); 
    } 
     $i++; 
    } 
+0

Il peut les télécharger en utilisant un nom de variable tableau (addFile []) –

Questions connexes