IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Erreur 530 ftp


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut Erreur 530 ftp
    Bonjour,

    Suite à mon précédent sujet, j'ai continué de potacher mon petit programme, il fonctionne à merveille SAUF le plus important...
    Quand le programme veut se connecter au FTP pour télécharger la version, ça me met "Le serveur distant a retourné une erreur : (530) Non connecté".

    Pourtant je renseigne les ID (ils sont corrects) et le port (21).
    Donc je ne sais pas où se situe le souci en faite :-/.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     Sub dl()
     
            Dim monUriFichier As New System.Uri(ftp)
            Dim monUriDestinationFichier As New System.Uri(lac)
     
            If Not (monUriFichier.Scheme = Uri.UriSchemeFtp) Then
                MessageBox.Show("L'Uri du fichier sur le serveur FTP n'est pas valide",
                                "Une erreur est survenue", MessageBoxButtons.OK, MessageBoxIcon.Warning)
     
                Exit Sub
            End If
     
            If Not (monUriDestinationFichier.Scheme = Uri.UriSchemeFile) Then
                MessageBox.Show("Le chemin de destination n'est pas valide !",
                                "Une erreur est survenue",
                                MessageBoxButtons.OK, MessageBoxIcon.Warning)
     
                Exit Sub
            End If
     
            Dim monResponseStream As Stream = Nothing
            Dim monFileStream As FileStream = Nothing
            Dim monReader As StreamReader = Nothing
            Try
     
                Dim downloadRequest As FtpWebRequest = CType(WebRequest.Create(monUriFichier), FtpWebRequest)
     
                If Not user.Length = 0 Then
                    Dim monCompteFtp As New NetworkCredential(user, pass, "21")
                    downloadRequest.Credentials = monCompteFtp
                End If
     
                Dim downloadResponse As FtpWebResponse = CType(downloadRequest.GetResponse(), FtpWebResponse)
                monResponseStream = downloadResponse.GetResponseStream()
     
                Dim nomFichier As String = monUriDestinationFichier.LocalPath.ToString
     
                monFileStream = File.Create(nomFichier)
     
                Dim monBuffer(1024) As Byte
                Dim octetsLus As Integer
     
                While True
     
                    octetsLus = monResponseStream.Read(monBuffer, 0, monBuffer.Length)
                    If octetsLus = 0 Then
                        Exit While
                    End If
     
                    monFileStream.Write(monBuffer, 0, octetsLus)
                End While
                MessageBox.Show("Téléchargement effectué.")
     
            Catch ex As UriFormatException
                MessageBox.Show(ex.Message)
            Catch ex As WebException
                MessageBox.Show(ex.Message)
            Catch ex As IOException
                MessageBox.Show(ex.Message)
            Finally
     
                If monReader IsNot Nothing Then
                    monReader.Close()
                ElseIf monResponseStream IsNot Nothing Then
                    monResponseStream.Close()
                End If
     
                If monFileStream IsNot Nothing Then
                    monFileStream.Close()
                End If
            End Try
        End Sub
    Le code n'est pas parfait je le sais :-/ j'accepte toutes les critiques afin de m'améliorer.
    Merci d'avance de votre aide.
    Cordialement

    Vazer7070

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    je sais pas d'où vient ton erreur mais le troisième paramètre du constructeur de NetworkCredential n'est pas le numéro de port (déjà ce serait un entier) mais le domaine (utile pour les connexions NTLM par exemple). Si tu veux préciser le port indique le directement dans ton URL server. Essaie déjà ça et vois ce que ça te dit.

    Test faisable : remplace toutes tes variables par des constantes, si ça fonctionne c'est que c'est les manip' que tu fais dessus en amont qui sont à incriminer.
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    Alors mettre le port dans l'url, ça me met erreur 550 accès impossible.

    Et pour ce qui est du remplacement des variables par des constantes, ça fait pareil

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Re,

    je suppose que si tu ne précises pas le port dans l'URL (mais que tu le supprimes bien de ton appel au constructeur de NetworkCredential) tu auras le même résultat.
    A quoi ressemble l'URI de ton fichier destination ? (remplace l'IP par des x.x.x.x)
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    C'est l'ip en faite, je mettais non pas elle mais "ftp://ftp.mondomaine.fr/" qui est juste en soi mais pas pour le code^^

    Néanmoins, j'ai un dernier souci, j'ai un background worker pour faire progresser ma progressbar, néanmoins au lieu de lancer l'application, le téléchargement se fait PUIS l'application s'ouvre (on ne voit pas la progressbar du coup).
    Une idée.? :-/

    La déclaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub dl()
            BackgroundWorker1.RunWorkerAsync()
            While Me.BackgroundWorker1.IsBusy
                Application.DoEvents()
            End While
        End Sub
    Le lancement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Private Sub bw(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            Dim monUriFichier As New System.Uri(ftp)
            Dim monUriDestinationFichier As New System.Uri(lac)
     
            If Not (monUriFichier.Scheme = Uri.UriSchemeFtp) Then
                MessageBox.Show("L'Uri du fichier sur le serveur FTP n'est pas valide",
                                "Une erreur est survenue", MessageBoxButtons.OK, MessageBoxIcon.Warning)
     
                Exit Sub
            End If
     
            If Not (monUriDestinationFichier.Scheme = Uri.UriSchemeFile) Then
                MessageBox.Show("Le chemin de destination n'est pas valide !",
                                "Une erreur est survenue",
                                MessageBoxButtons.OK, MessageBoxIcon.Warning)
     
                Exit Sub
            End If
     
            Dim monResponseStream As Stream = Nothing
            Dim monFileStream As FileStream = Nothing
            Dim monReader As StreamReader = Nothing
            Try
     
                Dim downloadRequest As FtpWebRequest = CType(WebRequest.Create(monUriFichier), FtpWebRequest)
     
                If Not user.Length = 0 Then
                    Dim monCompteFtp As New NetworkCredential(user, pass)
                    downloadRequest.Credentials = monCompteFtp
                End If
     
                Dim downloadResponse As FtpWebResponse = CType(downloadRequest.GetResponse(), FtpWebResponse)
                monResponseStream = downloadResponse.GetResponseStream()
     
                Dim nomFichier As String = monUriDestinationFichier.LocalPath.ToString
     
                monFileStream = File.Create(nomFichier)
     
                Dim monBuffer(1024) As Byte
                Dim octetsLus As Integer
     
                While True
     
                    octetsLus = monResponseStream.Read(monBuffer, 0, monBuffer.Length)
                    If octetsLus = 0 Then
                        Exit While
                    End If
     
                    monFileStream.Write(monBuffer, 0, octetsLus)
                End While
     
     
            Catch ex As UriFormatException
                MessageBox.Show(ex.Message)
            Catch ex As WebException
                MessageBox.Show(ex.Message)
            Catch ex As IOException
                MessageBox.Show(ex.Message)
            Finally
     
                If monReader IsNot Nothing Then
                    monReader.Close()
                ElseIf monResponseStream IsNot Nothing Then
                    monResponseStream.Close()
                End If
     
                If monFileStream IsNot Nothing Then
                    monFileStream.Close()
                End If
            End Try
        End Sub
    Pendant l'action:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
            EarnProgressBar1.Value = e.ProgressPercentage
            Label3.Text = e.ProgressPercentage & "%"
        End Sub
    Après:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
            MessageBox.Show("Téléchargement effectué.")
        End Sub
    End Class

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Ayé ! Je viens de trouver ton souci (enfin à voir chez toi ).
    Voilà un exemple de code qui fonctionne chez moi (et en VB.NET, j'espère que tu apprécieras l'effort) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Try
        '' la requête pour le download
        Dim dlReq As FtpWebRequest = CType(WebRequest.Create("ftp://x.x.x.x//folder/sub/distantFile.bin"), FtpWebRequest)
        dlReq.Credentials = New NetworkCredential("user", "pass")
     
        '' la response pour récupérer le flux du fichier
        Dim dlResp As FtpWebResponse = CType(dlReq.GetResponse(), FtpWebResponse)
        Dim dlFile As Stream = dlResp.GetResponseStream()
        '' le buffer de byte qui servira ... de tampon
        Dim buffer(512) As Byte
        '' le fichier local qui recevra les données du fichier distant
        Dim localFile As FileStream = New FileStream("C:\\tmp\\localFile.bin", FileMode.Create)
     
        '' tant qu'on arrive à lire quelque chose on l'écrit dans le fichier local
        Dim readLen As Integer = dlFile.Read(buffer, 0, 512)
        While readLen > 0
            localFile.Write(buffer, 0, readLen)
            readLen = dlFile.Read(buffer, 0, 512)
        End While
        '' on ferme le fichier et on averti l'utilisateur
        localFile.Close()
        MBX("done")
     
    Catch ex As Exception
        MBX(ex.Message)
    End Try
    Toute la différence est dans l'URI du fichier distant : après l'IP j'ai mis 2 slashes ('/').
    pour info : je n'indique pas de port car j'utilise le port par défaut ; mon serveur distant est un Linux.

    Je regarderai ton problème de thread plus tard
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    tu es épique
    Cela fonctionne, merci bien de ta solution ^^

    Le souci de thread reste incompréhensible, car j'ai mis ce qu'il fallait, mais c'est comme si le BW ne se lance pas...aurai-je raté des lignes de code.?

  8. #8
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Je viens compléter le sujet concernant l'implémentation du BackgroundWorker et ses 3 events :

    On vérifie si le Bgw n'est pas déjà en cours d'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
            If Not Bgw.IsBusy Then
                Bgw.RunWorkerAsync()
            End If
        End Sub
    On rentre dans le thread. Dans le corps de cette procédure on ne mets SURTOUT PAS A JOUR L'INTERFACE (LES CONTROLES) DU LOGICIEL ou alors on sort en appelant ReportProgress :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
       Private Sub Bgw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles Bgw.DoWork
            Try
                '' la requête pour récupérer la taille du fichier 
                Dim dlReq As FtpWebRequest = CType(WebRequest.Create("ftp://x.x.x.x//folder/sub/distantFile.bin"), FtpWebRequest)
                dlReq.Credentials = New NetworkCredential("user", "pass")
                dlReq.Method = WebRequestMethods.Ftp.GetFileSize
                Dim response As FtpWebResponse = DirectCast(dlReq.GetResponse(), FtpWebResponse)
                Dim fileSize = response.ContentLength
     
                '' la requête pour télécharger le fichier
                dlReq = CType(WebRequest.Create("ftp://x.x.x.x//folder/sub/distantFile.bin"), FtpWebRequest)
                dlReq.Credentials = New NetworkCredential("user", "pass")
                dlReq.Method = WebRequestMethods.Ftp.DownloadFile
                Dim dlResp As FtpWebResponse = DirectCast(dlReq.GetResponse(), FtpWebResponse)
                Dim dlFile As Stream = dlResp.GetResponseStream()
     
                Using localFile As New FileStream("C:\tmp\localFile.bin", FileMode.Create)
     
                    Dim Length As Integer = 2048
                    Dim buffer As Byte() = New Byte(Length - 1) {}
                    Dim bytesRead As Integer = dlFile.Read(buffer, 0, Length)
                    Dim bytes As Integer = 0
     
                    Dim totalBytesRead As Long = bytesRead
                    While bytesRead > 0
                        localFile.Write(buffer, 0, bytesRead)
                        Bgw.ReportProgress(CInt(totalBytesRead * 100 / fileSize), fileSize)
                        bytesRead = dlFile.Read(buffer, 0, Length)
                        totalBytesRead += bytesRead
                    End While
                End Using
                'On vérifie que le fichier téléchargé existe et qu'il pèse le bon poids.
                e.Result = Tuple.Create(File.Exists("C:\tmp\localFile.bin") AndAlso New FileInfo("C:\tmp\localFile.bin").Length = fileSize, "Opération réussie")
            Catch ex As Exception
                e.Result = Tuple.Create(False, "Echec de l'opération : " & vbNewLine & ex.ToString)
            End Try
        End Sub
    On rentre dans cette procédure pour mettre à jour les contrôles côté UI (ici la barre de progression) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Private Sub Bgw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles Bgw.ProgressChanged
            If Not e.ProgressPercentage > 100 Then
                ProgressBar1.Value = e.ProgressPercentage
            End If
        End Sub
    Le thread se termine ici et PAS AILLEURS (avec gestion : opération réussie, erreur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      Private Sub Bgw_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles Bgw.RunWorkerCompleted
            Dim tup = TryCast(e.Result, Tuple(Of Boolean, String))
            If Not tup Is Nothing Then
                If tup.Item1 = True Then
                    MessageBox.Show(tup.Item2, "Réussite", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Else
                    MessageBox.Show(tup.Item2, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                End If
            End If
        End Sub
    Enjoy A+

    Si besoin d'explications supplémentaires, il ne faut pas hésiter

  9. #9
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2016
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 135
    Points : 45
    Points
    45
    Par défaut
    wallace, si je pouvais, je ferais une statue de toi dans mon jardin...Merci beaucoup à toi et à jopopmk pour votre aide si précieuse qui me permet maintenant de réussir ce que j'ai envie de faire

  10. #10
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par vazer7070 Voir le message
    wallace, si je pouvais, je ferais une statue de toi dans mon jardin...Merci beaucoup à toi et à jopopmk pour votre aide si précieuse qui me permet maintenant de réussir ce que j'ai envie de faire
    Je comprends que ça fasse plaisir d'avoir un code fonctionnel mais le but c'est de pouvoir le réutiliser dans n'importe quel autre contexte en tenant compte des explications et commentaires.

    EDIT : j'ai ajouté la gestion réussite et erreur à la sortie du BGW.

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur connexion FTP
    Par bruninho dans le forum Pentaho
    Réponses: 0
    Dernier message: 11/04/2011, 08h55
  2. erreur transfert FTP ( ascii au lieu de bin )
    Par lolo2mars dans le forum Réseau
    Réponses: 2
    Dernier message: 14/03/2008, 20h27
  3. Erreur 530 avec serveur ftp (pure-ftpd & proftpd)
    Par Arnard dans le forum Debian
    Réponses: 3
    Dernier message: 18/03/2007, 18h18
  4. Écrire le log des Erreurs via FTP sur UNIX
    Par Alnsam dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 07/03/2007, 16h10
  5. Erreur TextFromServeur FTP
    Par scott33 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 29/12/2006, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo