Upload fichier et barre de progression

Eléphant du PHP | 337 Messages

25 avr. 2019, 15:39

Bonjour à tous,

J'essaye désespérément de faire fonctionner une barre de progression pendant l'upload d'un fichier, mais rien à faire ça coince.
Peut-être un oeil neuf parviendra-t-il à voir ce qui cloche ?

Voici les codes :

FORMULAIRE D'UPLOAD (fichier.php) :

Code : Tout sélectionner

echo "<FORM id='upload_form' action='_up.upload.php' method='POST' enctype='multipart/form-data' target='resultat'>"; echo "<input type='hidden' name='".ini_get('session.upload_progress.name')."' value='progression' />"; echo "<input type='file' name='fichier' id='file'>"; echo "<a onClick='Upload();'>TRANSFERT</a>"; echo "<iframe id='resultat' name='resultat' src='_up.upload.php'></iframe>"; echo "</FORM>"; echo "<div id='progress' class='progress'><div class='bar'></div></div>";


SCRIPT JS :

Code : Tout sélectionner

function Upload() { $('#progress .bar').html('0%'); $('#progress .bar').width('0%'); $('#upload_form').submit(); setTimeout('Avancee()', 450); } function Avancee() { $.get('_up.progress.php', function(data) { var texte = "Transfert : " + data + '%'; var pourcentage = data + '%'; $('#progress .bar').html(texte); $('#progress .bar').width(pourcentage); if(data < 100) setTimeout('Avancee()', 150); }); }


PAGE D'UPLOAD (_up.upload.php) :

Code : Tout sélectionner

foreach($_FILES as $_FICHIER) { $_NOM_FICHIER = "un_nom_quelconque.extension"; /* Ici, des conditions pour vérifier le format, le poids, etc. */ // 4. Upload ok else if(move_uploaded_file($_FICHIER['tmp_name'], "./Upload/".$_NOM_FICHIER)) { echo "Transfert réussi"; // Redirection auto echo "<script>top.location.href='fichiers.php';</script>"; } // 5. Si échec de l'upload, affichage de l'erreur else { /* Ici, des conditions pour vérifier le type d'erreur */ } }


ET ENFIN, PAGE DE PROGRESSION DE L'UPLOAD (_up.progress.php) :

Code : Tout sélectionner

session_start(); $key = ini_get('session.upload_progress.prefix').'progression'; if(!empty($_SESSION[$key])) { $_ENCOURS = $_SESSION[$key]['bytes_processed']; $_TOTAL = $_SESSION[$key]['content_length']; $_POURCENTAGE = ceil(($_ENCOURS / $_TOTAL)*100); } else { $_POURCENTAGE = 100; } echo $_POURCENTAGE;

J'ai fait de trèèèèès nombreux tests, et ce qui ne fonctionne pas semble se situer dans le fichier _up.progress.php : il ne me récupère rien dans la variable $_SESSION[$key] qui reste désespérément vide, donc forcément je suis toujours à 100 du premier coup. La barre d'upload passe direct à 100, l'upload s'effectue parfaitement, mais je n'ai aucun track de la progression par $_SESSION[$key]['bytes_processed'].

L'upload fonctionne, le JS qui gère l'avancée de la barre aussi, c'est le $_SESSION[$key] qui reste vide.

Quelqu'un voit-il mon erreur ?

Merci de votre aide.

PS : j'ai testé, je suis bien en PHP > 5.4, et session.upload_progress.enabled est bien à TRUE.

Avatar du membre
Eléphanteau du PHP | 19 Messages

25 avr. 2019, 20:06

au vu du code il me semble normal que $_SESSION[$key] sois vide vu que nulle part tu as un :

Code : Tout sélectionner

$_SESSION[$key]="quelque_chose";

c'est comme si tu disais

Code : Tout sélectionner

$my_variable="toto"; echo $my_array[$my_variable];
le "echo" va ne va rien te retourner.
il faut que tu définisse quelque part avant

Code : Tout sélectionner

$my_array["toto"]="quelque_chose"; $my_variable="toto"; echo $my_array[$my_variable];
ou

Code : Tout sélectionner

$my_variable="toto"; $my_array[$my_variable]="quelque_chose"; echo $my_array[$my_variable];
ce qui dans les 2 cas remplira la meme clé dans l'array
EX Administrateur infogérence infrastructure web.( chaine de télévision ; et autre site a données sensibles). Très bonne connaissance en : routeur , firewall ,switch , serveur linux ubuntu ,apache , php, mysql (y compris master-slave), et bien d'autre technologies. Pratiquant le php assez regulierement , depuis la version 3.0 ,surtout comme langage de script ,tel que pour redémarrer des services windows via une interface web. Cherchant a se reconvertir ,suite a un Burn-out ,dans le dev php-mysql ,sur paris,RP-ouest.

Eléphant du PHP | 337 Messages

26 avr. 2019, 13:30

Je vois... mais alors du coup quelle serait cette valeur à affecter à $_SESSION[$key] ?

Ça se joue dans la variable $_POST peut-être ? $_POST['quelque_chose_qui_recupere_le_tracking'] ?

Eléphant du PHP | 337 Messages

27 avr. 2019, 16:38

J'ai suivi à la lettre la page https://www.php.net/manual/fr/session.u ... ogress.php mais sans succès, décidément.

Il y a d'ailleurs quelque chose qui m'échappe, en rapport avec la remarque de Saveus ci-dessus. La page précitée affirme la chose suivante :
"Lorsque PHP détecte une requête POST de ce type, il remplira un tableau dans $_SESSION, où l'index est une valeur concaténée des options de configuration session.upload_progress.prefix et session.upload_progress.name. La clé est typiquement récupérée en lisant ces configurations INI."


Puis elle donne le code :

Code : Tout sélectionner

$key = ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")]; var_dump($_SESSION[$key]);


La seconde partie de $key serait donc $_POST[ini_get("session.upload_progress.name")].

Mais par la suite, la page donne l'exemple suivant, avec un formulaire HTML organisé comme suit :

Code : Tout sélectionner

<form action="upload.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" /> <input type="file" name="file1" /> <input type="file" name="file2" /> <input type="submit" /> </form>


...et la variable SESSION qui serait censée ressembler à ça :

Code : Tout sélectionner

$_SESSION["upload_progress_123"] = array( /* ...... */);


Il me semble donc qu'il y a un truc qui ne colle pas, entre :
- d'un côté : la concaténation de ini_get("session.upload_progress.prefix") avec $_POST[ini_get("session.upload_progress.name")]
- de l'autre : l'exemple $_SESSION["upload_progress_123"] qui ne me semble pas correspondre exactement à ça...

Bref, je suis perplexe, et je galère depuis une semaine là-dessus :lol:

Avatar du membre
Eléphanteau du PHP | 19 Messages

27 avr. 2019, 21:40

hello , j ai répondu un peu trop vite je pense , il semble que la syntaxe soit effectivement correcte.
et

Code : Tout sélectionner

$key = ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")];
genere un nom de variable présent dans la session.

pour débugger ton problème
déja essaye de coller un

Code : Tout sélectionner

session_start()
au début de ta page d'upload (_up.upload.php)
car si la session est démarré après le début de l'upload ça peu, peu être poser problème.
ensuite fait un

Code : Tout sélectionner

print_r($key);exit;
juste après $key=...
et regarde ce que ça te retourne.
ensuite fait un

Code : Tout sélectionner

print_r($_SESSION);exit;
ce qui va t'afficher toute les variables de session.
dans le style :
Array ( [fav] => oui [new] => non [pagin] => 7 [type] => 99 [nbaff] => 200 [sort] => delta [visit] => oui [hideq] => non )


pour que ca marche le nom de variable que te retourne l'affichage de $key doit correspondre a un nom de variable dans l'affichage des variables de sessions
EX Administrateur infogérence infrastructure web.( chaine de télévision ; et autre site a données sensibles). Très bonne connaissance en : routeur , firewall ,switch , serveur linux ubuntu ,apache , php, mysql (y compris master-slave), et bien d'autre technologies. Pratiquant le php assez regulierement , depuis la version 3.0 ,surtout comme langage de script ,tel que pour redémarrer des services windows via une interface web. Cherchant a se reconvertir ,suite a un Burn-out ,dans le dev php-mysql ,sur paris,RP-ouest.

Eléphant du PHP | 337 Messages

27 avr. 2019, 23:00

Merci pour ta réponse Saveus.

J'ai fait de multiples tests, et je crois que c'est la variable $_POST[ini_get('session.upload_progress.name')] qui reste vide, quoique je fasse. Donc évidemment à partir de là le reste ne fonctionne pas

Avatar du membre
Eléphanteau du PHP | 19 Messages

27 avr. 2019, 23:32

oui ça parait logique
vu que tu as 3 pages
et que tu défini

Code : Tout sélectionner

echo "<input type='hidden' name='".ini_get('session.upload_progress.name')."' value='progression' />";
dans page fichier.php

cette valeur est passé a la page : _up.upload.php

sauf que si tu ne redéfini pas la variable dans cette page pour la reposter a la page 3 ... c'est normal que ca ne retourne rien ;-)
EX Administrateur infogérence infrastructure web.( chaine de télévision ; et autre site a données sensibles). Très bonne connaissance en : routeur , firewall ,switch , serveur linux ubuntu ,apache , php, mysql (y compris master-slave), et bien d'autre technologies. Pratiquant le php assez regulierement , depuis la version 3.0 ,surtout comme langage de script ,tel que pour redémarrer des services windows via une interface web. Cherchant a se reconvertir ,suite a un Burn-out ,dans le dev php-mysql ,sur paris,RP-ouest.

Eléphant du PHP | 337 Messages

28 avr. 2019, 11:14

Eeeeuh je suis un peu lent comme garçon, j'ai pas compris 8-|

Eléphant du PHP | 337 Messages

28 avr. 2019, 11:18

Ah si pardon... il faut que je redéfinisse dans _up.upload.php :

Code : Tout sélectionner

$prefix = ini_get('session.upload_progress.prefix'); $name = ini_get('session.upload_progress.name'); $key = $prefix.$_POST[$name];
??

Je vais essayer.

Eléphant du PHP | 337 Messages

28 avr. 2019, 12:00

Nope. Nope nope nope. Je commence à envisager de laisser tomber #-o

Avatar du membre
Eléphanteau du PHP | 19 Messages

28 avr. 2019, 12:21

tu n as pas vraiment de les redéfinir , tu as surtout besoin de passer les variable vers la page _up.progress.php
sois en post mais le mieux serrais sois de passer la variable en $_GET sois en $_SESSION

du style

dans _up.upload.php

Code : Tout sélectionner

$keyname=$_POST[ini_get("session.upload_progress.name")] echo '<iframe name="xxxx" src="_up.progress.php?keyname='.$keyname.'"></iframe>';

et dans up.progress.php

Code : Tout sélectionner

$key = ini_get("session.upload_progress.prefix") . $_GET["keyname"];


ou



dans _up.upload.php

Code : Tout sélectionner

session_start(); $_SESSION["keyname"]=$_POST[ini_get("session.upload_progress.name")]

et dans up.progress.php

Code : Tout sélectionner

$key = ini_get("session.upload_progress.prefix") . $_SESSION["keyname"];
EX Administrateur infogérence infrastructure web.( chaine de télévision ; et autre site a données sensibles). Très bonne connaissance en : routeur , firewall ,switch , serveur linux ubuntu ,apache , php, mysql (y compris master-slave), et bien d'autre technologies. Pratiquant le php assez regulierement , depuis la version 3.0 ,surtout comme langage de script ,tel que pour redémarrer des services windows via une interface web. Cherchant a se reconvertir ,suite a un Burn-out ,dans le dev php-mysql ,sur paris,RP-ouest.

Eléphant du PHP | 337 Messages

28 avr. 2019, 13:26

Merci de te préoccuper de moi Saveus :D

Mais ça fonctionne pas. En GET, en POST, en tout ce que je veux ou peux.

Cela dit, je suis quand même perplexe, parce que j'ai suivi à la lettre la doc de php.net, et il n'y est nulle part fait mention de cette redéfinition de la variable. Et d'ailleurs, si la page _up.upload.php est appelée dans une iframe, la variable n'est-elle pas déjà définie dans son contenant fichier.php ?

Parce que sinon je suis tombé sur ça : https://abciweb.developpez.com/tutoriel ... x-php.html

Un système différent, d'après ce qui est dit accessible à tous sans effort, mais qui me paraît toutefois bien compliqué et assez obscur. Et bien que n'étant pas une star de la prog (loin s'en faut) je ne suis pourtant pas non plus un débutant :D

Avatar du membre
Eléphanteau du PHP | 19 Messages

29 avr. 2019, 12:20

mmm si possible donne moi tes trois pages (complete) et les eventuelles pages de présentation qui contiennent les iframes ou autre méthode qui appellent ces 3 pages , je vais te débugger ca sur mon poste .
EX Administrateur infogérence infrastructure web.( chaine de télévision ; et autre site a données sensibles). Très bonne connaissance en : routeur , firewall ,switch , serveur linux ubuntu ,apache , php, mysql (y compris master-slave), et bien d'autre technologies. Pratiquant le php assez regulierement , depuis la version 3.0 ,surtout comme langage de script ,tel que pour redémarrer des services windows via une interface web. Cherchant a se reconvertir ,suite a un Burn-out ,dans le dev php-mysql ,sur paris,RP-ouest.

Eléphant du PHP | 337 Messages

29 avr. 2019, 12:59

Wow, ça c'est du service après vente ! Les codes que j'ai mis au début sont quasi complets (sauf les inclusions de la bibliothèque jquery, les entêtes et démarrages de session, et les quelques conditions que j'ai supprimées pour plus de clarté)

Avatar du membre
Eléphanteau du PHP | 19 Messages

10 mai 2019, 17:06

hello , non non , je n ai pas oublier , juste que quand je teste en local , les envois sont quasi instantané... donc pas facile a débugguer
EX Administrateur infogérence infrastructure web.( chaine de télévision ; et autre site a données sensibles). Très bonne connaissance en : routeur , firewall ,switch , serveur linux ubuntu ,apache , php, mysql (y compris master-slave), et bien d'autre technologies. Pratiquant le php assez regulierement , depuis la version 3.0 ,surtout comme langage de script ,tel que pour redémarrer des services windows via une interface web. Cherchant a se reconvertir ,suite a un Burn-out ,dans le dev php-mysql ,sur paris,RP-ouest.