Barre de progression php

Sohhff
Invité n'ayant pas de compte PHPfrance

22 juin 2016, 13:06

Bonjour,

Dans le cadre d'un stage, je réalise un site web en php permettant à l'utilisateur d'uploader son fichier sur le serveur local de l'entreprise. L'upload ftp fonctionne et j'arrive même à récuperer le pourcentage de fichier uploadé mais j'aimerais afficher une barre de progression lorsqu'il upload le fichier.

Comment faire ?

Je travaille sous PHP 5.1.6 (extension APC non possible).

Voici mon code :
$size_ftp = sprintf("%u",ftp_size($ftp, $directory_include.'/'.$file)); //je récupère la taille du fichier 
$ret = ftp_nb_get($ftp,$local, $directory_include.'/'.$file, FTP_BINARY);  
$size_local = filesize($local);
while ($ret == FTP_MOREDATA && $stop == 0){
       clearstatcache();
       $size_local =filesize('$local');                                
       $size_percent = ($size_local / $size_ftp) * 100;
       $ret = ftp_nb_continue($ftp);
}
if ($ret != FTP_FINISHED) {
    echo "There was an error downloading the file...";
}
Merci d'avance,
Cordialement

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 juin 2016, 15:26

salut,

Tu peux essayer de mettre $size_percent dans une variable de session et coté front du js qui fait un pooling sur u script qui retourne cette variable de session.

il ne faut pas que le script continue de faire des requêtes serveur après 100% de l'upload (donc un flag à prévoir).

pour la progression client => php y ça dans la doc e http://php.net/manual/fr/session.upload-progress.php

PS : faudrait p'tet les inciter à faire une légère upgrade de php on est à php 7 là :mrgreen: (5.1.6 est sortiele 23/08/2006 y a 10 ans a 2 mois et 4 jour prêt => http://museum.php.net/php5/ section museum ;) ).


@+
Il en faut peu pour être heureux ......

Sohhff
Invité n'ayant pas de compte PHPfrance

22 juin 2016, 16:08

Merci pour ton aide.
Malheuresement, je ne suis que stagiaire ainsi je dois faire avec les moyens du bord :(
Je vais me documenté sur le pooling (je ne connais pas, je ne suis qu'un débutant en programmation web) puis je testerais ta solution.
Par contre, je ne vois pas comment utiliser l'option sessions.upload-progress dans le cadre d'un upload à partir d'un serveur ftp ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 juin 2016, 17:23

pour la partie ftp c'est pas possible
par contre c'est utilisable si le fichier tu l'envois du poste client vers le serveur php (qui lui envois vers le ftp).

Même stagiaire y a moyen d'être "force" de proposition, t'es pas la pour apporter les cafés vindiou !!!! ;)

Plus sérieusement il y a a y gagner, que ce soit de la sécurité (dans php et par l'apport des nouvelle fonctionnalitée), des perfs etc tout un tas de trucs. et c'est maintenu ;)

@+
Il en faut peu pour être heureux ......

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

22 juin 2016, 19:06

Même stagiaire y a moyen d'être "force" de proposition, t'es pas la pour apporter les cafés vindiou !!!! ;)
En revanche, pour les photocopies... ;-)

Et sinon il existe pas mal de ressources/tuto pour faire cela :
https://www.google.fr/search?q=jquery+u ... rogressbar
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 16 Messages

23 juin 2016, 08:59

pour la partie ftp c'est pas possible
par contre c'est utilisable si le fichier tu l'envois du poste client vers le serveur php (qui lui envois vers le ftp).
@+
Et sinon il existe pas mal de ressources/tuto pour faire cela :
https://www.google.fr/search?q=jquery+u ... rogressbar
Merci pour vos contributions. Mais, je précise que le site web que je dois implémenter doit pouvoir permettre à l'utilisateur de récupérer des fichiers sur des serveurs ftp public et de les uploader sur le serveur local de l'entreprise.
Donc, je suis obligé d'utiliser ftp dans le sens serveur public exterieur -> serveur client.

Et concernant la version de php, ils sont au courant du retard qu'ils ont mais semble t'il ne trouve pas utile de changer. Concernant mon problème, cela se résoudrait-il plus facilement avec une version PHP plus récente ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

23 juin 2016, 09:16

Les fonctions de PHP ftp_* n'ont pas la possibilité de renvoyer le statut d'avancement donc elles ne répondront pas à ton besoin.

Regarde du côté de Curl avec notamment l'option CURLOPT_PROGRESSFUNCTION
http://php.net/curl
Par contre il te faudra une version de PHP récente (>5.3 il me semble)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 16 Messages

23 juin 2016, 09:29

Les fonctions de PHP ftp_* n'ont pas la possibilité de renvoyer le statut d'avancement donc elles ne répondront pas à ton besoin.

Regarde du côté de Curl avec notamment l'option CURLOPT_PROGRESSFUNCTION
http://php.net/curl
Par contre il te faudra une version de PHP récente (>5.3 il me semble)
Dans le code que j'ai posté sur le premier post, j'arrive à récuperer le statut d'avancement grâce à la fonction ftp_nb_get qui renvoi FTP_MOREDATA lorsque l'upload est en cours ainsi avec un while, je peut executer du code php et donc récuperer le nombre d'octet uploadé (=filesize sur le fichier serveur client).

Je vais néanmoins me renseigner sur Curl. De plus, l'utilisateur doit pouvoir controler l'upload ainsi il doit pouvoir arreter et reprendre l'upload s'il le souhaite. Est-il possible de réaliser cela ? curl résout-il ce problème également ?

Merci d'avance.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

23 juin 2016, 11:03

Je vais néanmoins me renseigner sur Curl. De plus, l'utilisateur doit pouvoir controler l'upload ainsi il doit pouvoir arreter et reprendre l'upload s'il le souhaite. Est-il possible de réaliser cela ? curl résout-il ce problème également ?
Oui, mais je n'ai jamais essayé moi-même :
Soit avec les options CURL_READFUNC_PAUSE et CURL_WRITEFUNC_PAUSE avec un callback sur une fonction.
Soit avec la fonction PHP curl_pause : https://secure.php.net/manual/fr/functi ... -pause.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 16 Messages

23 juin 2016, 12:08

D'accord, je vais tester alors.
Encore merci pour le temps que vous (moogli et toi) avez passé à m'aider et je reviendrais pour vous dire si cela a fonctionné.