Téléchargement de fichier texte ftp ?

Résolu
tictac08 - 23 avril 2013 à 12:49
 Utilisateur anonyme - 23 avril 2013 à 16:56
Bonjours, je m'en remet à la communauté Vbfrance car là, je ne sais plus quoi faire

J'ai pourtant essayé une multitude de code de téléchargement de fichier sur un FTP mais j'en reviens toujours au même problème : Le fichier téléchargé est vide.

J'ai essayé les code de ce forum, de developpez, de msdn, et j'en passe sur deux serveur FTP ; un avec protocole FTP et un autre avec HTTP.

Rien à faire, c'est strictement vide ! (0 octet)

Voici ma procédure :

1 - Je liste les fichiers du dossier avec ce code :

Public Function dlFichier(ByVal serveurCible As String, _
                                  ByVal identifiant As String, _
                                  ByVal motDePasse As String) As Array


        Dim monResponseStream As Stream = Nothing
        Dim monStreamReader As StreamReader = Nothing
        Dim monResultat As Array = Nothing



        ' Instanciation d'une Uri qui va contenir le chemin source
        Dim monUriServeur As New System.Uri(serveurCible)


        ' Vérification de la validité de l'Uri du fichier sur le serveur FTP
        If Not (monUriServeur.Scheme = Uri.UriSchemeFtp) Then
            MessageBox.Show("L'Uri du serveur FTP n'est pas valide", _
                            "Une erreur est surevnue", _
                            MessageBoxButtons.OK, MessageBoxIcon.Warning)
            'Si Uri non valide, arrêt du listage
            Return monResultat
            Exit Function
        End If
        Dim filelist As New List(Of String)
        Try


            ' Création de la requête de récupération de la liste des fichiers
            Dim maRequeteListe As FtpWebRequest = CType(WebRequest.Create(monUriServeur), FtpWebRequest)
            maRequeteListe.Method = WebRequestMethods.Ftp.ListDirectoryDetails


            ' Vérification de la présence des identifiants d'un compte, si aucun alors
            ' la connexion se fait en mode anonyme
            Dim monCompteFtp As New NetworkCredential(identifiant, motDePasse)
            maRequeteListe.Credentials = monCompteFtp


            ' Récupération de la liste de fichiers
            Dim maResponseListe As FtpWebResponse = CType(maRequeteListe.GetResponse, FtpWebResponse)

            ' Placement du flux provenant du serveur dans un streamreader
            monStreamReader = New StreamReader(maResponseListe.GetResponseStream, _
                                               Encoding.Default)

            ' Lecture du stream reader
            Dim listeBrute As String = monStreamReader.ReadToEnd

            ' Découpage de chaque fichier dans la liste concaténée de fichiers
            Dim separateur() As String = {Environment.NewLine} ' -> retour chariot
            ' Découpage et récupération des noms de fichiers
            Dim tableauListe() As String = listeBrute.Split(separateur, _
                                           StringSplitOptions.RemoveEmptyEntries)
            Dim listeFinale As New List(Of String)

            ' Lecture du tableau et tri des noms de fichiers
            Dim i As Integer = 0
            While i < tableauListe.Length
                ' Les répertoires se différencient des fichiers par le fait que  
                ' la chaîne que l'on récupère commence par un "d".
                ' ON n peux donc dire dossier = commence avec "d"
                If Not tableauListe(i).StartsWith("d") Then
                    filelist.Add(tableauListe(i).Substring(tableauListe(i).LastIndexOf(" ") + 1))
                End If
                i += 1
            End While


            monResultat = listeFinale.ToArray


            ' Gestion des exceptions
        Catch ex As UriFormatException
            MessageBox.Show(ex.Message)

        Catch ex As WebException
            MessageBox.Show(ex.Message)

        Finally

            ' Fermeture des différents flux utilisés
            If monResponseStream IsNot Nothing Then
                monResponseStream.Close()
            End If

            If monStreamReader IsNot Nothing Then
                monStreamReader.Close()
            End If

        End Try
        'Fonction de l'étape 2
            
        Return monResultat

    End Function


2 - Je rajoute ce code :

For Each setfiles In filelist
                publicfile = "http://cloud.olympe.in/remote.php/webdav/srv/" & ComboBox1.SelectedItem & "/" & setfiles
                My.Computer.Network.DownloadFile(publicfile, My.Application.Info.DirectoryPath & "\server" & ComboBox1.SelectedItem & "" & setfiles, identifiant, motDePasse, False, 1000000, True, FileIO.UICancelOption.DoNothing)

            Next

            MsgBox("Données ajoutées !", vbInformation, "Ok")
        Catch ex As Exception
            MsgBox(ex.Message & " sur << " & publicfile & ">>", MsgBoxStyle.YesNo, "Echec")
            End
        End Try


ce qui nous donne donc :

Public Function dlFichier(ByVal serveurCible As String, _
                                  ByVal identifiant As String, _
                                  ByVal motDePasse As String) As Array


        Dim monResponseStream As Stream = Nothing
        Dim monStreamReader As StreamReader = Nothing
        Dim monResultat As Array = Nothing



        ' Instanciation de deux Uri qui vont contenir les chemins source et destination
        Dim monUriServeur As New System.Uri(serveurCible)


        ' Vérification de la validité de l'Uri du fichier sur le serveur FTP
        If Not (monUriServeur.Scheme = Uri.UriSchemeFtp) Then
            MessageBox.Show("L'Uri du serveur FTP n'est pas valide", _
                            "Une erreur est surevnue", _
                            MessageBoxButtons.OK, MessageBoxIcon.Warning)
            'Si Uri non valide, arrêt du listage
            Return monResultat
            Exit Function
        End If
        Dim filelist As New List(Of String)
        Try


            ' Création de la requête de récupération de la liste des fichiers
            Dim maRequeteListe As FtpWebRequest = CType(WebRequest.Create(monUriServeur), FtpWebRequest)
            maRequeteListe.Method = WebRequestMethods.Ftp.ListDirectoryDetails


            ' Vérification de la présence des identifiants d'un compte, si aucun alors
            ' la connexion se fait en mode anonyme
            Dim monCompteFtp As New NetworkCredential(identifiant, motDePasse)
            maRequeteListe.Credentials = monCompteFtp


            ' Récupération de la liste de fichiers
            Dim maResponseListe As FtpWebResponse = CType(maRequeteListe.GetResponse, FtpWebResponse)

            ' Placement du flux provenant du serveur dans un streamreader
            monStreamReader = New StreamReader(maResponseListe.GetResponseStream, _
                                               Encoding.Default)

            ' Lecture du stream reader
            Dim listeBrute As String = monStreamReader.ReadToEnd

            ' Découpage de chaque fichier dans la liste concaténée de fichiers
            Dim separateur() As String = {Environment.NewLine} ' -> retour chariot
            ' Découpage et récupération des noms de fichiers
            Dim tableauListe() As String = listeBrute.Split(separateur, _
                                           StringSplitOptions.RemoveEmptyEntries)
            Dim listeFinale As New List(Of String)

            ' Lecture du tableau et tri des noms de fichiers
            Dim i As Integer = 0
            While i < tableauListe.Length
                ' Les répertoires se différencient des fichiers par le fait que  
                ' la chaîne que l'on récupère commence par un "d".
                ' ON n peux donc dire dossier = commence avec "d"
                If Not tableauListe(i).StartsWith("d") Then
                    filelist.Add(tableauListe(i).Substring(tableauListe(i).LastIndexOf(" ") + 1))
                End If
                i += 1
            End While


            monResultat = listeFinale.ToArray


            ' Gestion des exceptions
        Catch ex As UriFormatException
            MessageBox.Show(ex.Message)

        Catch ex As WebException
            MessageBox.Show(ex.Message)

        Finally

            ' Fermeture des différents flux utilisés
            If monResponseStream IsNot Nothing Then
                monResponseStream.Close()
            End If

            If monStreamReader IsNot Nothing Then
                monStreamReader.Close()
            End If

        End Try
        Try
            For Each setfiles In filelist
                publicfile = "http://cloud.olympe.in/remote.php/webdav/srv/" & ComboBox1.SelectedItem & "/" & setfiles
                My.Computer.Network.DownloadFile(publicfile, My.Application.Info.DirectoryPath & "\server" & ComboBox1.SelectedItem & "" & setfiles, identifiant, motDePasse, False, 1000000, True, FileIO.UICancelOption.DoNothing)

            Next

            MsgBox("Données ajoutées !", vbInformation, "Ok")
        Catch ex As Exception
            MsgBox(ex.Message & " sur << " & publicfile & ">>", MsgBoxStyle.YesNo, "Echec")
            End
        End Try
        Return monResultat

    End Function


J'ai essayé sur mes deux serveur mais impossible de récupérer quoi que ce soit.(et aucune MSGBOX pour me dire qu'il y a une erreur...)

Il y aurait t'il quelqu'un pour m'aider ?

7 réponses

Utilisateur anonyme
23 avril 2013 à 13:48
Bonjour,
Tout en connaissant déjà le nom du fichier, je viens de tester avec ça:
Try
My.Computer.Network.DownloadFile("ftp://login:password@ftpperso.free.fr/toto.zip", Application.StartupPath & "\toto.zip")
Catch ex As Exception
      MsgBox(ex.Message)
End Try


Ca fonctionne bien mais attention, le protocole FTP est sensible à la case, le fichier se nomme "toto.zip" si tu mets "Toto.zip" ça ne fonctionnera pas.

Il faut aussi bien vérifier le chemin du serveur (dans un sous-dossier ou non etc...)

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 avril 2013 à 14:03
Salut

Ce qui m'épate dans ton code, tictac, c'est que, après cette ligne
Dim listeBrute As String = monStreamReader.ReadToEnd
tu ne fasses aucun test sur l'objet pour être sûr que les données sont toutes arrivées.
Un StreamReader peut être asynchrone, donc il doit y avoir un moyen de tester si le flux sous-jacent a bien tout récupéré.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
0
Merci de cette réponse extrèmement rapide !

Donc, comme My.Computer.Network.DownloadFile pouvais contenir aussi un identifiant et un username comme ca j'ai essayer et ça marche

C'est sans doute à cause de la case, merci beaucoup a toi en tout cas ^^
0
Bon j'ai remis exactement le même code dans mon appli et rebelotte, fichier vide....
J'ai l'impression qu'il faut que je tape moi même le chemin du fichier...pas pratique...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
23 avril 2013 à 14:14
Mais non, il doit y avoir un moyen je regarde...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Je sais d'où viens le problème !

Sur un doute j'ai inserer une 2eme form sur mon project et je l'affiche après la verification des fichier et...RIEN, donc mon problème viens du listage des fichier de mon dossier.
0
Utilisateur anonyme
23 avril 2013 à 16:56
Re:
Un bon exemple sur CETTE PAGE

Télécharge-le c'est pas trop mal

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Rejoignez-nous