Uploader un fichier [Résolu]

Signaler
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
-
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
-
Bonjour,
Pour downloader un fichier de mon serveur vers mon PC j'utilise
Declare Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL _
As String, ByVal szFileName As String, ByVal dwReserved As Long, _
 ByVal lpfnCB As Long) As Long
URLDownloadToFile(0, URL, LocalFilename, 0, 0).
Comment fait-on le contraire aussi simplement ?

8 réponses

Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 juin 2021
156
Soit tu fais une page qui permet l'upload puis tu cherches à passer les bons paramètres au serveur (requête POST avec le fichier)
Soit tu passes par FTP.
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Merci pour ta réponse.
En pratique je fais comment ?
Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 juin 2021
156
Google :
vb6 upload ftp
vb6 upload HTTP post
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Bonsoir,
J'avais bien cherché sur Google avant de poser la question ici.
J'ai trouvé par exemple
Option Explicit

Private Declare Sub Sleep Lib "kernel32.dll" _
    (ByVal dwMilliseconds As Long)

Private Function UploadFile(ByVal sURL As String _
    , ByVal sUserName As String _
    , ByVal sPassword As String _
    , ByVal sLocalFileName As String _
    , ByVal sRemoteFileName As String) As Boolean

    UploadFile = False

    With Inet1
        .UserName = sUserName
        .Password = sPassword
        .Execute sURL, "PUT " & sLocalFileName & " " & sRemoteFileName

        Do While .StillExecuting
            Sleep 100
            DoEvents
        Loop

        UploadFile = (.ResponseCode = 0)
        Debug.Print .ResponseCode
    End With
End Function

Private Sub cmdUpload_Click()
    UploadFile "ftp://localhost", "", "", "C:\Test.txt", "/Level1/Uploaded.txt"
End Sub
Est-ce que je ne risque pas d'avoir des problèmes parce que mon utilisateur ne dispose pas de MSINET.OCX ?
J'ai déjà eu des problèmes avec d'autres fichiers .ocx donc j'essaye d'éviter.
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Bonjour,
En utilisant le code ci-dessous, l'upload fonctionne très bien (je retrouve bien le fichier sur le serveur)
With Inet
.URL = "ftp://ftp.xxxxx.be"
.UserName = "xxxx.be"
.Password = "******"
.Execute , "PUT " & GraphImage & url
End With

Le problème est que je ne parviens pas à savoir dans VB quand l'upload est terminé.
J'ai ajouté avant End With
   While .StillExecuting
DoEvents
Wend
.Execute , "CLOSE"
mais ça boucle !
Une idée ?
Messages postés
14799
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 juin 2021
156
Bonjour,

N'ayant plus VB6 sur ma machine actuelle, je ne saurais tester le code.
Je trouve étrange que ce code pose problème.

Mais, cela me conforte plus dans mon avis qui est d'abandonner VB6 (plus maintenu depuis 12 ans) et de passer à .NET.
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Abandonner VB6 au profit de VB.net est plus facile à dire qu'à convertir des dizaines de millier de lignes !
En fait sans les 4 dernières lignes ça fonctionne très bien sauf que je ne sais pas quand le chargement est terminé.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Bonjour,
Mets une instruction de ton choix (msgbox ou autre) après ton wend.
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Je ne comprends pas ce que tu veux dire ou faire.
Il y a une instruction après Wend : .Execute , "CLOSE" !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
C'est alors moi qui ne te comprends plus.
Tu dis vouloir ceci :
sauf que je ne sais pas quand le chargement est terminé.
Ton chargement est terminé lorsque tu sors de la boucle de DoEvents
Et donc : me relire.

J'observe par ailleurs (mais il s'agit là d'un autre aspect) que tu ne prends aucune protection. Quid si faille ?
Je te conseille à cet égard de lire ceci :
http://msdn.microsoft.com/en-us/library/office/ff844743%28v=office.15%29.aspx

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Merci deme relire aussi
J'ai ajouté avant End With

While .StillExecuting
DoEvents
Wend
.Execute , "CLOSE"

mais ça boucle !


En d'autres termes, si j'ajoute quoi que ce soit après le Wend il ne se passe rien puisque ça boucle car StillExecuting est toujours false alors que le fichier est bien uploadé !
donc j'ai supprimé la boucle While - Wend ainsi que l'execute "close" et ça fonctionne très bien.

Je ne trouve pas de quoi parer à une faille dans l'article dont tu donnes le lien.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
1) le lien que je t'ai invité à lire plus haut traite les impondérables éventuels et permet de quitter sans tout "breaker".
2) voici un autre lien (dans les sources ici-même déposées) :
http://codes-sources.commentcamarche.net/source/6920-upload-ftp-inet-avec-progressbar
celui-ci va plus loin encore. Il est même assorti d'une barre constatant la progression.
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
1) Le lien explique que si StillExecuting on demande à l'utilisateur s'il veut continuer à attendre.
Ma question est que StillExecuting reste à true ( je ne sais toujours pas pourquoi parce qu'en fait le fichier est bien chargé) donc si j'attends qu'il devienne false je boucle;
2) je n'ai que faire d'une barre de progression pour charger un fichier de 200k : c'est fini avant que la barre commence à s'afficher !

Merci de rester dans le sujet.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
1)
Merci de rester dans le sujet.
Je crains d'avoir dans ce cas à te quitter.
Si tu n'es pas capable de "voir "dans ce code qu'il est capable (barre de progression ou non) qu'il a chargé un pourcentage (et donc 100 % également), avec ou sans barre de progression, j'abdique, monsieur.
2) quant au premier lien : hé non ... il ne se contente pas d'attendre sans raison ...
Bonne chance (moi, je vais me reposer. J'en ai besoin, crois-moi).

Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Je crains d'avoir dans ce cas à te quitter. Ouf !
Quand je pose une question sur ce forum j'espère chaque fois que tu ne vas pas répondre car je suis alors certain que je n'aurai pas la réponse à ma question qui est, je le répète pour les autres qui auraient une réponse pertinente

Pourquoi le programme ne sort-il pas dela boucle
While .StillExecuting
DoEvents
Wend
alors que le fichier est bien uploadé ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Je n'en sais rien, ami, dès lors que je n'ai pas le reste de ton code.
On ignore même (tu n'en as rien dit) dans quel évènement tu lances ce code.
Cela peut par exemple arriver lorsque le code que tu as montré s'exécute alors que le contrôle inet n'est pas encore totalement chargé.
Il se peut par ailleurs que tu sois encore en possession d'une version non corrigée et que comparer avec True conduise alors à une erreur : retour de 1 au lieu de -1 (qui est la valeur de True en VB6).
Si tel était le cas (version non corrigée de VB6), il conviendrait de faire ta boucle While avec "tant que la propriété stillexecuting n'est pas fausse" et non avec "tant que la propriété stillexecuting est vraie"
Une petite remarque : il M'a fallu faire des recherches (que TU aurais pu faire) pour apprendre qu'une version antérieure de INET comportait cette petite erreur.
Tes remarques font que ce sera là ma dernière intervention dans cette discussion (réponse à ton propre voeu).
Voilà voilà ...

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Code complet
Private Sub URL_Click()
On Error GoTo InetError
InetState.Visible = True
With Inet
.URL = "ftp://ftp.yyyyyy.be"
.UserName = "xxxxxx.be"
.Password = "********"
.Execute , "PUT " & App.Path & "" & ...
'While .StillExecuting
' DoEvents
'Wend
'.Execute , "CLOSE"
End With

MsgBox ("L'image a étét transférée sur ..."), vbInformation
InetState.Visible = False
On Error GoTo 0
Exit Sub

InetError:
MsgBox ("Impossible de transférer l'image : " & Err.Number & " (" & Err.Description & ")" Inet.ResponseCode & ":" & Inet.ResponseInfo), vbExclamation
InetState.Visible = False
On Error GoTo 0
Exit Sub
End Sub

Private Sub Inet_StateChanged(ByVal State As Integer)
Select Case State
Case icNone: InetState.Text = InetState.Text & vbCrLf & "Connect Failed.... Error"
Case icResponseReceived: InetState.Text = InetState.Text & vbCrLf & "Response Received"
Case ichostresolvinghost: InetState.Text = InetState.Text & vbCrLf & "Looking for IP Address"
Case icHostResolved: InetState.Text = InetState.Text & vbCrLf & "Found IP Address"
Case icConnecting: InetState.Text = InetState.Text & vbCrLf & "Connecting"
Case icConnected: InetState.Text = InetState.Text & vbCrLf & "Connected"
Case icRequesting: InetState.Text = InetState.Text & vbCrLf & "Sending a Request"
Case icRequestSent: InetState.Text = InetState.Text & vbCrLf & "Request Send"
Case icReceivingResponse: InetState.Text = InetState.Text & vbCrLf & "Receiving Response"
Case icResponseReceived: InetState.Text = InetState.Text & vbCrLf & "Response Received"
Case icDisconnecting: InetState.Text = InetState.Text & vbCrLf & "Disconnecting"
Case icDisconnected: InetState.Text = InetState.Text & vbCrLf & "Disconnected"
Case icResponseCompleted: InetState.Text = InetState.Text & vbCrLf & "Response Completed"
Case icError
MsgBox ("Impossible de transférer l'image : " & Inet.ResponseCode & ":" & Inet.ResponseInfo), vbExclamation
End Select
End Sub
Tel quel, tout fonctionne bien; InetState.Text est une textbox dans laquelle je vois bien les étapes de la progression et je reçois le message "l'image a été transférée"

Si je retire les commentaires sur
'While .StillExecuting
' DoEvents
'Wend
'.Execute , "CLOSE"
je vois aussi la progression dans la textbox dont voici le contenu

Found IP Address
Connecting
Connected
Receiving Response
Response Received
Sending a Request
Request Send
Receiving Response
Response Received
Sending a Request
Request Send
Receiving Response
Response Received
Sending a Request
Request Send
Receiving Response
Response Received
Sending a Request
Request Send
Receiving Response
Response Received
Sending a Request
Request Send
Receiving Response
Response Received
Sending a Request
Request Send
Receiving Response
Response Received

mais ensuite ça boucle (aucun message); après "un certain temps" : Visual Basic a cessé de fonctionner ...
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
J'ai essayé de remplacer While .StillExecuting
par While .StillExecuting <> false
et même While .StillExecuting = true
et aussi Do until .StillExecuting = False ... Loop
idem.
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
J'ai trouvé sur un autre forum qu'il suffit de mettre une pause dans la boucle, et ça fonctionne !
While Inet.StillExecuting
DoEvents
Sleep 1000 '1sec
DoEvents
Wend
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)