[PHP] Créer un multi-upload

Fermé
Daqpo - 27 juin 2010 à 00:21
 bugs2010 - 6 juil. 2010 à 01:04
Bonjour, j'ai un script simple pour héberger des fichier 1 par 1, mais j'aimerais créer un système de multi-upload pour aller plus vite mais je ne sais pas comment faire.

Je ne veux pas un script tout fait avec le multi-upload mais juste ce qu'il fait ajouté a mon code actuel.

Je pense qu'il faut utilisé une chaine PHP style for() mais je sais pas du tout comment faire, comment compté le nombre de fois il faut répété le code etc.... même coté HTML je sais pas comment faire.

Merci d'avance.

PS : Si vous voulez, je peux parler sur MSN pour arrivé a bout du problème plus rapidement que sur le forum.

24 réponses

avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
Modifié par avion-f16 le 5/07/2010 à 22:23
Je me suis trompé dans mes explications.
En fait, la structure n'est pas
$_FILES['fichiers'][0]['...'] 
$_FILES['fichiers'][1]['...'] 
$_FILES['fichiers'][2]['...'] 
...
Mais
$_FILES['fichiers']['...'][0] 
$_FILES['fichiers']['...'][1] 
$_FILES['fichiers']['...'][2] 
...


Pour me faire pardonner, je t'ai codé un exemple fonctionnel.
https://gist.github.com/anonymous/d3c4d9dc096a464c374e
Ton ordinateur ne fait pas ce que tu veux ... mais ce que tu lui dis de faire.
19
D'accord, je vais regarder ton code, mais comme j'aime bien savoir comment faire et non avoir le code directement sans aucune explication, j'aimerais avoir plus d'explications.

Donc coté HTML : name="fichiers[]"

Coté PHP : On utilise foreach() mais comment ? (Serrais t-il possible d'avoir une explication comme le tout premier message (malheureusement faux) ?)

Merci d'avance.
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
6 juil. 2010 à 00:37
Voilà la structure :
$_FILES['fichiers']['...'][0] 
$_FILES['fichiers']['...'][1] 
$_FILES['fichiers']['...'][2] 
...
Les '...' peuvent être remplacés par 'size', 'name', 'tmp_name', 'error', ...

En partant de ça, on sait que si $_FILES['fichiers']['error'][0] existe, alors les autres données ($_FILES['fichiers']['name'][0], ...) existent aussi.

On stocke donc le numéro de l'entrée dans la variable $nb qui vaut 0 par défaut. À la fin de la boucle foreach, on l'incrémente de 1, de cette façon, au prochain "passage" dans la boucle, elle vaudra 1, puis 2, ainsi de suite. Avec cette variable $nb, nous pourrons donc récupérer les données (error, tmp_name, size, ...) de cette façon : $_FILES['fichiers']['donnee'][$nb]

$allowedTypes est un array contenant les types MIME autorisés. Je vérifie donc si $_FILES['fichiers']['type'][0] est dans cet array. À la place de cette vérification, j'aurais pu vérifier l'extension, mais cette vérification serait alors inutile : il ne faut pas faire confiance aux extensions.

Je pense avoir expliqué ce qui était nécessaire.
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
27 juin 2010 à 00:33
Salut.

Pour la partie HTML, il faudra passer par du Javascript pour l'ajout dynamique de champs.
Pour le name de tes input (type="file"), il faudra mettre la même chose avec des crochets au bout.
Par exemple : name="fichiers[]".

Au niveau du PHP, il suffit de traiter les fichiers un par un avec une boucle foreach.
foreach($_FILES['fichiers'] as $fichier) {
    /* Traitement du fichier.
     * $fichier est un array contenant les données sur le fichier actuel :
     * size, filename, ...
     */
}
0
D'accord, pour le traitement du fichier j'ai tout ce qu'il faut avec les if() de vérifications, par contre je comprend pas a partir d'ici :

* $fichier est un array contenant les données sur le fichier actuel :
* size, filename, ...
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
27 juin 2010 à 19:53
Dans la boucle foreach, $fichier représente un fichier.
Tu peux donc accèder aux valeurs de $fichier['size'], $fichier['type'], $fichier['name'], $fichier['error'], $fichier['tmp_name'], ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
D'accord mais foreach() permet de traité un array et non du HTML avec name="fichiers[]"...

name="fichiers[]" = Array php convertie en HTML ? Si oui :

Il faut pas plutôt faire ceci :

name="fichiers[0]"
name="fichiers[1]"
name="fichiers[2]"
name="fichiers[3]" ....

Merci d'avance.
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
28 juin 2010 à 12:55
$_FILES['fichiers'] sera un array.
Inutile de préciser des chiffres, ça se fera automatiquement.
D'ailleur, en PHP, tu peux même faire ça :
<?php
$array[] = 'Valeur 1';
$array[] = 'Valeur 2';

var_dump($array);
?>
0
D'accord et pour le dernier point de sécurité :

Je veux limité l'upload simultané à 5, si une personne crée une page en HTML il pourra en mètre en illimité, comment bloqué si c'est plus que 5 en PHP ?
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
28 juin 2010 à 15:38
$nb = 0;
foreach($_FILES['fichiers'] as $fichier) {
    if($nb < 5) {
        // Traitement
        $nb++;
    }
}
0
Re, désolé pour la remonté, mais encore une question :

Pour le traitement du fichier, avec les vérifications je doit plus utilisé ceci : if(filesize($_FILES[fichier]['tmp_name']) > $taille) mais ceci : if(filesize($fichier['tmp_name']) > $taille) ?

Et puis comment affiché le les lien tout en bas ?
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
2 juil. 2010 à 14:14
Oui.
Pour afficher les liens, il suffit de faire des echo dans la boucle foreach.
0
Ok mais les lien vont s'afficher à la suite :
http://site.com/http://site.com/http://site.com/http://site.com/

Moi je souhaité faire une présentation :

Fichier 1 hébergé :
https://www.salesforce.com/products/platform/overview/
HTML
BBCode
Fichier 2 hébergé :
https://www.salesforce.com/products/platform/overview/
HTML
BBCode

.....
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
2 juil. 2010 à 15:25
Et bien il suffit d'écrire le HTML correspondant à chaque "bloc" ...
0
Comment ?

<?php
echo $fichier;
?>
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
2 juil. 2010 à 21:21
Tu as appris le PHP où ?!
$fichier est un array, tu ne peux pas l'afficher !
Puis si tu ne me donnes pas plus de détails comme le dossier dans lequel tu enregistres le fichier est le nom que tu lui donnes, j'aurais du mal à t'aider.
0
Le dossier est /up/ a partir de la racine et le nom des fichiers héberger est renommé par un uniqid() + md5().
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
3 juil. 2010 à 19:49
Dans la boucle foreach, stocke dans une variable ($url) l'url complète vers le fichier.
Après, il te suffit d'écrire le code HTML avec des echo (pense à utiliser les entités HTML).
0
Je comprend pas trop, actuellement j'utilise ceci pour 1 seul fichier :

<?php
echo '<p><a href="'.$repertoire.$id.$extension.'" onclick="window.open(this.href); return false;">'.$repertoire.$id.$extension.'</a></p>'."\n";
?>

Et pour mes if(), j'utilise ceci :

if(filesize($_FILES[fichier]['tmp_name']) > $taille)

Si c'est un array, il faut que je mètre $fichier[] ?

Désoler mais je ne suis pas très fort en PHP, et la je suis vraiment perdu, merci pour ta patience.
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
4 juil. 2010 à 00:30
Déjà $_FILES[fichier] c'est invalide : il manque les guillemets et c'est "fichiers", avec un "s".

Comme je te l'ai déjà dis, $_FILES['fichiers'] est donc un array : on l'explore grâce à une boucle foreach.
À l'intérieur de la boucle, $fichier représente le fichier en cours de traitement. Toutes les opérations dans cette boucle sont répétées pour chaque fichier.

Donc dans tes conditions, c'est $fichier['tmp_name'], $fichier['size'], $fichier['error'], ... qu'il faut utiliser.

Pour afficher les codes HTML et BBCode, il suffit de faire de simples echo des codes, en pensant à remplacer les caractères <, > et " par leur équivalent HTML (amp, lt, gt).
0
Re, j'ai testé avec un simple if() et cela ne fonctionne pas...

<input type="file" name="fichier[]" />

<?php

$nb = 0;
foreach($_FILES['fichier'] as $fichier) {
if($nb < 5) {
if(!preg_match("/image\//i", $fichier['type']))
echo '<p>Le fichier n\'est pas une image.</p>'."\n";
else {
echo 'OK';
}
$nb++;
}
}

?>

Résulta : Sa affiche 5 fois (a cause du if limité a 5) que le fichier est n'est pas une image, pourtant j'ai bien utiliser $fichier comme tu ma dit...
0
avion-f16 Messages postés 19252 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 10 février 2025 4 505
4 juil. 2010 à 18:15
Ce n'est pas possible qu'il t'affiche 5 alertes si tu n'as qu'un fichier car le contenu de la boucle foreach ne serait exécuté qu'une fois car il n'y a qu'une entrée dans le tableau $_FILES['fichier'].
0