Progression Upload cURL

Bonsoir à tous

Lorsque j’envoi un fichier sur mon FTP, je n’arrive pas à suivre la progression… xx Mo / xx Mo
Voici les méthodes, ai-je oublié une étape ?

Pour télécharger, pas de souci, la progression s’affiche.

La méthode Serveur_Envoyer :
<code 4D>
//$1 Chemin serveur
//$2 Fichier local à envoyer

//upload
C_BLOB($in;$out)
C_ENTIER LONG($err)
TABLEAU ENTIER LONG($optionNames;0)
TABLEAU TEXTE($optionValues;0)

//–upload-file
AJOUTER À TABLEAU($optionNames;CURLOPT_UPLOAD)
AJOUTER À TABLEAU($optionValues;“1”)
//–user
AJOUTER À TABLEAU($optionNames;CURLOPT_USERNAME)
AJOUTER À TABLEAU($optionValues;$user)
AJOUTER À TABLEAU($optionNames;CURLOPT_PASSWORD)
AJOUTER À TABLEAU($optionValues;$password)
//–ssl-reqd
AJOUTER À TABLEAU($optionNames;CURLOPT_USE_SSL)
AJOUTER À TABLEAU($optionValues;“1”)
//–insecure
AJOUTER À TABLEAU($optionNames;CURLOPT_SSL_VERIFYPEER)
AJOUTER À TABLEAU($optionValues;“0”)
AJOUTER À TABLEAU($optionNames;CURLOPT_SSL_VERIFYHOST)
AJOUTER À TABLEAU($optionValues;“0”)
//–ftp-upload
AJOUTER À TABLEAU($optionNames;CURLOPT_READDATA)
AJOUTER À TABLEAU($optionValues;$2)

Si ($3=Vrai)
AJOUTER À TABLEAU($optionNames;CURLOPT_XFERINFOFUNCTION)
AJOUTER À TABLEAU($optionValues;“CB_PROGRESS_DL”)
Fin de si

$err:=cURL (“sftp://$adresse/”+$1;$optionNames;$optionValues;$in;$out)
$0:=$err
</code 4D>

La méthode CB_PROGRESS_DL
<code 4D>
C_ENTIER LONG($1;$2;$3;$4;$5)
C_BOOLÉEN($0)

//download info
$dltotal:=Arrondi($2/1048576;2)
$dlnow:=Arrondi($3/1048576;2)
//upload info
$ultotal:=$4
$ulnow:=$5

Si ($ultotal=0)
$progress:=Choisir($dltotal#0;$dlnow/$dltotal;-1)
$message:=Choisir($progress#-1;Chaîne($dlnow)+" Mo sur “+Chaîne($dltotal)+” Mo";“connexion…”)
<>Info_Progress:=$message
ÉCRIRE VARIABLE PROCESS(<>ProcessMessage;<>Info_Progress;$message)
$now:=$dlnow*100/$dltotal
ÉCRIRE VARIABLE PROCESS(<>ProcessMessage;<>vaThermo;$now)
Sinon
$progress:=Choisir($ultotal#0;$ulnow/$ultotal;-1)
$message:=Choisir($progress#-1;Chaîne($ulnow)+"/"+Chaîne($ultotal)+" octet(s) uploaded";“connecting…”)
<>Info_Progress:=$message
ÉCRIRE VARIABLE PROCESS(<>ProcessMessage;<>Info_Progress;$message)
Fin de si

</code 4D>

Bonsoir,

Je te conseille d’utiliser la version spécifique qu’a mis en ligne Keisuke qui se nomme cURL_FTP, qui reproduit toutes les commandes de 4D Internet command, qui se programme en mode objet, et non pas avec des tableaux, de qui est plus facile, et qui résout ce genre de petits soucis.

Qui plus est, c’est cette version qui sera suivie.

Ok je sais ce qu’il me reste à faire :wink:

Merci à toi

Stanislas

J’ai regardé 4d-plugin-curl-ftp
Mais je ne vois pas de commandes de progression :roll:

Ou peut etre “sizeUpload” :-o

Ca se passe dans le “callbackMethod”

elle recoit en paramètre l’offset et le total à faire.

Il n’ya plus qu’a mettre dedans le thermomètre.

Il y a une base exemple sur le github de Keisuke

Pour en revenir a mon premier message, pouvez vous me confirmer qu’il n’est pas possible de suivre la progression d’un upload :?:

Je vous confirme qu’il est possible de suivre la progression d’un upload en incluant dans les paramètres une méthode “CallBack” qui sera appellée à chaque évolution de l’Offset

On est d’accord que je devrai récupérer cette valeur dans la méthode CB_PROGRESS_DL en $4 et $5

On est d’accord!

sauf que cela fonctionne avec la version cURL_FTP, qui est plus mature,
et qu’il me semble que ce n’était pas ça avec la version initiale cURL

D’ailleurs cette version n’évolue plus depuis un an et il faut vraiment aller vers le nouveau plugin, qui est plus simple à gérer.

Ok j’ai avec cURL_FTP :
<code 4D>
C_OBJET($options)

$path:=Dossier système(Bureau)+“test.zip”

OB FIXER($options;
“URL”;$ftp+"/test.zip";
“USERNAME”;$user;
“PASSWORD”;$password)

$createMissingDir:=1

$error:=cURL_FTP_Send (JSON Stringify($options);$path;$createMissingDir;callbackMethod)
</code 4D>

Mais je ne vois pas comment récupérer ma variable de progression :roll:

Creer une méthode callbackMethod (qui peut s’appeler autrement genre (SFTP_Thermo_ob)

C_OBJET($options;$context)
$context:=Créer objet(“Téléchargement”;Faux;“ID_Thermo”;$ID_Thermo) //Variable objets de contexte à “faire passer” dans la methode SFTP_Thermo_ob // ici je passe l’ID du thermomètre utilisé, et je précise le “sens” Téléchargement (vrai) ou upload (faux)
$options:=Créer objet(“URL”;“sftp://”+$site+$2;“USERNAME”;$3;“PASSWORD”;$4;“PRIVATE”;JSON Stringify($context))

$error:=cURL_FTP_Send (JSON Stringify($options);$Path;1;“SFTP_Thermo_ob”)

Methode SFTP_Thermo_ob

C_TEXTE($1;$2)
C_BOOLÉEN($0;$down)
C_RÉEL($progres;$all;$moyenne;$temps_Passe;$Temps_Restant)
C_ENTIER LONG($ID_Thermo)
C_OBJET($context;$first)
$first:=JSON Parse($1)// Variable objet renvoyée par le plugin durant le transfert
$context:=JSON Parse($2) //paramètres que l’on fait passer dans la méthode

$down:=OB Lire($context;“Téléchargement”;Est un booléen) //variable passé dans context
$ID_Thermo:=OB Lire($context;“ID_Thermo”;Est un entier long)//variable passé dans context

Si ($down)//Gestion Download
$Taille_Done:=OB Lire($first;“sizeDownload”)
$Taille_Total:=OB Lire($first;“contentLengthDownload”)
$vitesse:=OB Lire($first;“speedDownload”)/1024
$temps_Passe:=OB Lire($first;“totalTime”)
$progres:=$Taille_Done/$Taille_Total
$moyenne:=$Taille_Done/1024/$temps_Passe
Sinon //Gestion Upload
$Taille_Done:=OB Lire($first;“sizeUpload”)//Variables objets renvoyées dans $1 durant la progression
$Taille_Total:=OB Lire($first;“contentLengthUpload”)
$vitesse:=OB Lire($first;“speedUpload”)/1024
$temps_Passe:=OB Lire($first;“totalTime”)
$progres:=$Taille_Done/$Taille_Total
$moyenne:=$Taille_Done/1024/$temps_Passe

Fin de si

//Exemples de petits trucs que l’on peut faire
C_OBJET($Speed)
OB FIXER($Speed;“Progress”;Chaîne($progres*100;"##0,## %;;"))
OB FIXER($Speed;“Temps Passé”;Chaîne heure($temps_Passe))
OB FIXER($Speed;“Temps Restant”;Chaîne heure($Temps_Restant))
OB FIXER($Speed;“Vitesse”;Chaîne($vitesse;"### ### ### Ko;;"))
OB FIXER($Speed;“Vitesse Moyenne”;Chaîne($moyenne;"### ### ### Ko;;"))
OB FIXER($Speed;“Pic”;Chaîne(<>Pic_Speed;"### ### ### Ko;;"))
OB FIXER($Speed;“Fait :”;Chaîne($Taille_Done/1024;"### ### ### Ko;;"))
OB FIXER($Speed;“A télécharger :”;Chaîne($all/1024;"### ### ### Ko;;"))

$0:=<>StopEvt //Variable d’interruption dans le formulaire de thermo utilisé (Chez moi il s’appelle <>StopEvt) Si elle passe à vrai, le transfert s’arrete

La méthode est appelée en permanence durant le transfert (je ne connais pas le rythme)

Merci :pray:

Je vais tester cela

$Taille_Done est OK
Par contre $Taille_Total reste à 0 :roll:

Traces la méthode callback et regardes le contenu de la variable $1 après l’avoir parsée

  • json Parse($1)

Attention aux noms de propriétés d’objet qui sont sensible à la casse (SizeDownload n’est pas sizeDownload)

Penses aussi à bien passer la propriété “Telechargement” à faux en upload pour avoir le bon aiguillage dans la méthode callback (la méthode est générique et sert dans les 2 cas…

Merci :pray: