8722 sujets

Développement web côté serveur, CMS

Hello à tous,

Nouvellement inscrit ici, car jusque la les tutos et les réponses sur ce forum m'ont largement suffi Smiley smile .
J'en profite donc pour remercier toute l'équipe de alsacréations!

Alors voilà ma question: j'ai un script d'upload de fichiers via un formulaire html (type input=file) et je souhaiterai pouvoir informer l'utilisateur au fur et à mesure qu'un fichier est chargé que ce dernier a été uploadé.

Mon but serait de pouvoir récupérer les information contenue dans le dossier temporaire de chargement des fichiers "upload_tmp_dir". Ou si vous avez une autre méthode...

Voici le code, je l'ai commenté, il n'est pas très propre car je ne suis pas un expert et j'ai regroupé plusieurs scripts que j'ai adapté à ma sauce Smiley rolleyes

<?php
$i = 0;
foreach($_FILES['picture']['name'] as $n => $name) //définit un boucle pour que chaque fichier sélectionné soit traité
{
$i++;
$name = rand(100000000, 999999999) . " " . $name; //assigne une valeur aléatoire avant le nom pour les upload depuis les iPhone
$last_key = end(array_keys($_FILES['picture']['name'])); //permet de définir le dernier fichier traité par foreach
$extension = strtolower(pathinfo($name, PATHINFO_EXTENSION)); //récupère l'extension du fichier et la met en minuscule
$autorise = array('gif','png' ,'jpg' ,'jpeg' ,'avi' ,'mov' ,'zip' ,'rar' ,'mp3' ,'m4a'); //définit dans un tableau les extensions autorisées
if(!in_array($extension,$autorise)) //check l'extension des fichiers sélectionnés
{
	$name = substr($name,10);
	$erreur = '<div class="erreur">Le fichier suivant n\'est pas autorisé:<br></div><br><b> ' . $name . '</b><br><br>Tu peux uploader uniquement les fichiers:<br>images, vidéos et musiques';
	goto erreur;
}
elseif($_FILES['picture']['error'] === UPLOAD_ERR_OK) //check si il n'y a aucune autre erreur
{
	$erreur = '<div>Une erreur lors du transfert de fichier s\'est produite<br><br>Ré-essaie!</div>';
	goto erreur;
}
if(!isset($erreur)) //Si $erreur ne renvoie aucun résultat, on va plus loin
{
	$rand = chr(rand(97, 122)). chr(rand(97, 122)). chr(rand(97, 122)); mkdir('./tmp/' . $_POST['folder']); //création du rép avec autorisation
	$dossier = './tmp/' . $_POST['folder'] . '/'; //chemin du dossier de destination
	$name = strtr($name,
    'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
    'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); //on formate le nom du fichier
    $name = preg_replace('/([^.a-z0-9]+)/i', '-', $name);
	if(move_uploaded_file($_FILES['picture']['tmp_name'][$n], $dossier . $name)) //on déplace le fichier dans le dossier créé précédemment
    {
    	$name = substr($name,10); //on supprime les 10 caractères (valeurs aléatoires) pour l'affichage
		echo '<div>' . $name . '</div>';
		if($n === $last_key) //on vérifier si c'est le dernier fichier qui est traité
		{
			echo '<br><br><div class="ok">' . $i . ' fichier(s) uploadé(s) avec succès</div>';
			echo '<p><input type="button" class="button_back" value="RETOUR &#8634;" onClick="window.parent.location.reload()"></p>';
		}
    }
    else //Sinon (la fonction renvoie FALSE).
    {
        $erreur = '<div class="erreur">Echec de l\'upload, ré-essaie ou contact-moi</div>';
        goto erreur;
    }
}
else
{
	erreur:
	echo $erreur;
	echo '<p><input type="button" class="button_back" value="RETOUR &#8634;" onClick="window.parent.location.reload()"></p>';
	break;
}
}
?>


D'avance je vous remercie pour votre aide.

++ §hu
J'oubliais de préciser qu'avec ce script, le résultat s'affiche uniquement lorsque l'entier des fichiers ont été uploadé bien que j'aie mis un "echo $name;" pour chaque fichier traité (dans la boucle foreach), il les affiche uniquement lorsqu'il a traité tous les fichiers.

Je ne trouve pas d'explication clair sur le fonctionnement de l'upload via http. C'est peut-être ce processus que je comprends mal... Voici ce que je sais: le formulaire html envoie les fichiers via http sur mon serveur qui les stock dans son répertoire temporaire. Puis mon script php avec un "move_uploaded_file" les déplace dans le répertoire de mon choix.

La question est: est-il possible de récupérer des informations lorsque les fichiers sont en cours d'upload dans le fichier temporaire?

++ §hu
Je ne connais que relativement mal le sujet des uploads, mais il me semble que ton script php n'est effectivement exécuté que lorsque tous les fichiers ont été uploadés, ou autrement dit lorsque le transfert est totalement terminé.

Pour avoir des infos pendant que les fichiers sont uploadés, il me semble que tu es obligé de le faire par AJAX côté client, et des extensions php spécifiques doivent être activées.
Un grand merci pour cet élément de réponse qui malheureusement ne m'arrange pas Smiley lol ... je ne développe que très très peu et ne maitrise absolument pas l'ajax...

++ §hu
Je me disais qu'avec ces informations de tableau, peut-être qu'il y a moyen de faire qqu chose:
$_FILES['icone']['tmp_name']


L'espoir fait vivre Smiley smile

++ §hu
theshurikn a écrit :
L'espoir fait vivre Smiley smile

Oui mais cela ne te permettra pas d'avoir l'info voulue Smiley biggol
Je ne sais pas si ça peut t'intéresser, car c'est du JS, mais il existe des plugins assez magiques pour l'upload de plusieurs fichiers (sélection multiple, barre de progression, etc.). Il y a, par exemple, JQuery File Upload.
Récemment, j'ai testé un tout petit JS très pratique, me permettant d'offrir à l'utilisateur un aperçu de l'image sélectionnée AVANT le submit du formulaire. Ca s'appelle JQuery.Upload et tu peux le trouver ici.
Ces deux JS, of course, passent par Ajax.
Modifié par petibato (10 Oct 2013 - 22:56)
a écrit :
Je me disais qu'avec ces informations de tableau, peut-être qu'il y a moyen de faire qqu chose:
$_FILES['icone']['tmp_name']


Non, tmp_name contient juste le chemin où le fichier a été temporairement enregistré avant déplacement avec move_uploaded_file. En général ça ressemble à /tmp/xxx ou /var/www/id_site/tmp/xxx, où xxx est un nom plus ou moins aléatoire qui n'a absolument rien à voir avec le nom de fichier original ou son type.
salut,
juste pour info, avec la nouvelle API file en HTML5 tu peux faire déjà beaucoup de choses, notamment avoir un aperçu d'une image, sans passer par AJAX et bien sûr encore moins JQuery.
Cela dit, ça ne marchera évidemment que sur les navigateurs reconnaissant cela.
Un exemple ici.
Top merci à vous tous pour vos réponses!

Je vais regarder du côté de l'API file afin de prévenir avant la fin de l'upload si le fichier est trop gros. Je pense qu'avec cet API je devrais pouvoir réaliser ceci. C'est top, merci!

Sinon avec le
$_FILES['icone']['tmp_name']
je comptais rajouter le nom du fichier
[$n]
et ainsi checker si le fichier est présent ou non dans le dossier temporaire (= upload effectué).

J'ai également pensé à
is_uploaded_file
mais pas sur du coup non plus...

++ §hu
Modifié par theshurikn (11 Oct 2013 - 08:47)