Comment voulez-vous faire une boucle par tableau $_FILES?
Voici les intrants je veux faire une boucle par
Main photo: <input type="file" name="image[]" />
Side photo 1: <input type="file" name="image[]" />
Side photo 2: <input type="file" name="image[]" />
Side photo 3: <input type="file" name="image[]" />
Un couple de choses étranges qui s'est passé, quand je l'ai transféré rien-je utiliser le count($_FILES['image'])
, j'ai fait l'écho de cette fonction, et retourne une valeur de 5. Il devrait y avoir aucun élément de ce tableau. Pourquoi est-il un apport supplémentaire lorsque je n'ai que 4 fichiers pour commencer?
Maintenant avec la boucle elle-même, j'ai essayer d'utiliser la boucle foreach, mais il ne fonctionne pas.
foreach($_FILES['image'] as $files){echo $files['name']; }
Rien n'est venu, ce que je voulais finalement faire est de parcourir l'ensemble des images, assurez-vous qu'ils sont corrects, le format, la taille, et renommer chacun d'entre eux. Mais cette simple foreach() en boucle montre que quelque part, je ne peux même pas faire une boucle par le tableau $_FILES et le count() qui me confond encore plus quand il dire qu'il y a 5 éléments dans le tableau lorsque je n'ai même pas télécharger quoi que ce soit.
var_dump($_FILES)
? Un peu de débogage va un long chemin à déterminer ce que PHP est en train de faire.OriginalL'auteur Ben | 2011-03-26
Vous devez vous connecter pour publier un commentaire.
Votre formulaire de l'exemple devrait fonctionner correctement. C'est juste que vous vous attendez à la structure de la
$_FILES
superglobale être différente de ce qu'elle est réellement, lors de l'utilisation d'une structure de tableau pour les noms de champ.La structure de ce tableau multidimensionnel est comme suit:
À cet effet
count( $_FILES[ "fieldname" ] )
donnera5
.Mais le comptage des dimensions plus profondes seront aussi de ne pas produire le résultat que vous attendez. En comptant les champs avec
count( $_FILES[ "fieldname" ][ "tmp_name" ] )
par exemple, sera toujours en sorte que le nombre de champs de fichier, pas dans le nombre de fichiers qui ont déjà été téléchargés. Si vous souhaitez toujours avoir à parcourir en boucle les éléments pour déterminer si quelque chose a été téléchargé un fichier particulier en matière.MODIFIER
Donc, pour faire une boucle à travers les champs que vous feriez quelque chose comme ce qui suit:
Pour plus d'informations, voir les docs.
supposons que la meilleure pratique est [..]" Pas nécessairement. En fait, j'aime utiliser votre approche originale. Je vais mettre à jour ma réponse avec un exemple de comment faire une boucle à travers elle.
J'ai mis à jour ma réponse. Bonne chance avec elle.
Toujours un plaisir d'aider les gens qui veulent vraiment comprendre comment le code fonctionne réellement, au lieu de simplement copier aveuglément. 🙂
Cet exemple de boucle est dangereux car il suppose il y a au moins 2 fichiers téléchargés. Dans le cas d'un fichier, $_FILES['pièce jointe']['name'] est une chaîne, donc la variable $_FILES['pièce jointe']['name'][0] sera le premier caractère du nom.
OriginalL'auteur Decent Dabbler
il suffit de renommer vos champs de cette façon
et alors vous serez en mesure de le parcourir, comme d'habitude:
: OK, mais ce qui a causé le comportement décrit?
la façon matrice remplie. juste
print_r($_FILES)
dans les deux sens et à voir.en fait, vous pouvez, mais juste une autre façon.
count($_FILES)
ne fonctionne pas, vous avez pour vérifiererror
éléments au lieu: Je suis en train de dire que votre réponse doit l'expliquer.
OriginalL'auteur Your Common Sense
Fonction courte pour reconstruire $_FILES['fichiers'] pour certains plus attendus de la structure.
OriginalL'auteur j4r3k
J'ai trouvé une solution qui fonctionne pour $_FILES des tableaux de profondeur arbitraire. Une rapide explication, ce que vous avez besoin d'un algorithme qui fait cela:
Voici un code qui fonctionne réellement.
Appelez simplement sane_files_array sur la variable $_FILES et vous devriez être bon d'aller, peu importe à quelle profondeur le tableau $_FILES est. Cela devrait vraiment être une partie de la langue elle-même, parce que la mise en forme du tableau $_FILES est absolument ridicule.
OriginalL'auteur Lendrick
Peut-être:
Si vous avez de la boucle à travers les champs de fichier.
OriginalL'auteur woodgate
PHP du choix de la façon de traiter la variable $_FILES déchets beaucoup de temps dans le révélateur. @Lendrick réponse, voici une semblable approche OO.
OriginalL'auteur carrucha
J'ai eu du mal avec ce dilemme depuis presque une semaine! Rien de ce que j'ai trouvé sur le net pourrait m'aider. Je savais sorte de quoi faire, mais ne pouvait pas comprendre comment faire une boucle à travers le tableau $_FILES correctement jusqu'à présent, quand j'ai lu le post édité de la accepté de répondre.
J'ai apporté quelques modifications si, dans le script posté, car il ne fonctionne pas correctement pour moi. Je voulais être en mesure de déterminer si un fichier a été sélectionné à tous, donc j'ai changé la ligne
"si( !empty( $_FILES[ 'image' ][ 'error' ][ $index ] ) )"
pour
"si( !empty( $_FILES[ 'image' ][ 'size' ][ $index ] ) )"
et puis, au lieu de "return false;", j'ai mis la taille dans une variable à la place:
"$Taille = $_FILES[ 'upload' ][ 'size' ][ $index ];"
De cette façon, je pourrais vérifier si $variable de Taille était plus grande que zéro. Si c'était le cas, un fichier a été sélectionné et je pouvais continuer de compter le nombre de fichiers et de faire le téléchargement. Je n'ai pas utiliser les "inutiles" script après "return false;", dans la accepté de répondre. Espérons que cela aide quelqu'un.
: P
/MacD
OriginalL'auteur MacDknife