none
Upload un fichier (FTP) dans un répertoire non existant du serveur RRS feed

  • Discussion générale

  • Bonjour,

    Je développe actuellement un logiciel, et je voudrais créer une fonctionnalité qui permet d'upload des fichiers sur un serveur FTP indiqué par l'utilisateur. L'utilisateur doit cocher tous les fichiers qu'ils veut upload sur le serveur FTP qu'il a fourni, et ensuite tout les fichiers sont ajoutés dans une ListBox.

    J'ai fait ce code : 

                        Dim File As String
                        Dim Replace As String
                        For Each Items In FileUploadingList.Items
                            File = Items.ToString.Split(New String() {My.Settings.location & "\"}, StringSplitOptions.None)(1)
                            Replace = File.Replace("\", "/")
                            UploadStatusBar.Text = "Transfert des fichiers en cours : " & Items
                            My.Computer.Network.UploadFile(Items, TransfertHost.Text & Replace, TransfertUser.Text, TransfertPassword.Text)
                        Next

    Malheureusement, j'ai plusieurs problèmes :

    • Le premier étant le fait que si un répertoire est inexistant sur le serveur FTP, par exemple : Si je veux upload un fichier nommer "config.yml" et qu'il se trouve dans le répertoire My.Settings.location(c'est le répertoire des fichiers) & "\plugins\Essentials\config.yml".

    J'aimerais que ce fichier soit upload dans le répertoire ftp : "\plugins\Essentials\config.yml".

    Mais comme les répertoires et sous-répertoires "plugins" et "Essentials" n'existent pas sur le serveur FTP, une erreur me dit que le nom du fichier n'est pas correcte.

    Je voudrais dans ce problème créer les répertoire qui sont "vitales" à l'upload des fichiers, pour qu'ils aient exactement la même structure que le répertoire des fichiers sur l'ordinateur.

    • Mon deuxième problème est, je veux créer un affichage de la progression de l'upload "dynamique", je veux afficher le fichier qui est en train de se faire upload et quand ce fichier est fini d'upload, le supprimer de la liste, malheureusement je n'arrive pas à le faire car j'utilise la boocle "For Each" et si je modifie dans la boucle la liste, alors la boucle ne marche plus.
    dimanche 24 décembre 2017 23:48

Toutes les réponses

  • Bonjour,

    voici un exemple pour Upload votre fichier sur FTP :

          'à redéfinir selon votre site Ftp et votre login
            Dim user = "Votre user"
            Dim pass = "Votre mot de passe"
            Dim fichlocal = "c:/essai.jpg" 'Liens du fichier sur votre ordi
            Dim fichftp = "ftp://votreserveur/dossier1/dossier2/essai.jpg" 'lien du ftp et le dossier de destination
            'upload
            Try
                My.Computer.Network.UploadFile(fichlocal, fichftp, user, pass)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
     
            MessageBox.Show("Upload correctement effectuer", "ok") 'tite MessageBox que j'ai rajouter pour nous dire quand ça se termine.
     
            ' pour le download :
            'My.Computer.Network.DownloadFile(fichftp, fichlocal, user, pass)
     
            'les try permettent de récuperer l'erreur éventuelle

    ou une vidéo YouTube comment upload FTP :  Upload un fichier via FTP avec un ProgressBar

    j’espère que j'ai bien répondu a votre question,

    Cordialement,


    • Modifié zorro591 lundi 25 décembre 2017 08:15
    lundi 25 décembre 2017 08:04
  • Bonjour, merci d'avoir répondu.

    Malheureusement aucun de mes problèmes n'est résolu,

    Dans votre code, en imaginant que les dossiers "dossier1" et "dossier2" soient inexistant sur le serveur FTP, une erreur m'est retournée : "Le nom du fichier est invalide"

    De plus, l'application "freeze" lors de l'upload des fichiers.

    Avec votre code j'ai fait ça :

                    Dim user = TransfertUser.Text
                    Dim pass = TransfertPassword.Text
                    'à redéfinir selon votre site Ftp et votre login
                    For Each items In FileUploadingList.Items
                        Dim fichlocal = items 'Liens du fichier sur votre ordi
    
                        Dim fichftp = TransfertHost.Text & items.ToString.Split(New String() {My.Settings.location & "\"}, StringSplitOptions.None)(1) 'lien du ftp et le dossier de destination
                        'upload
                        fichftp.Replace("\", "/")
    
                        Try
                            My.Computer.Network.UploadFile(fichlocal, fichftp, user, pass)
                        Catch ex As Exception
                            MsgBox(ex.Message)
                        End Try
                    Next
    
    
    
                    MessageBox.Show("Upload correctement effectuer", "ok") 'tite MessageBox que j'ai rajouter pour nous dire quand ça se termine

    Quand la boucle "For Each" se lance, l'upload des fichiers commence. Lors de l'upload, l'application "freeze" et cela jusqu'à ce que tous les fichiers de la liste soit upload.

    En plus, si jamais un répertoire n'existe pas, comme je l'ai dit au dessus, une erreur m'est retournée.

    lundi 25 décembre 2017 10:09
  • Bonjour,

    j'ai repris les code FTP et Username dans ce site : Upload FTP

    au sinon tu pourras faire ceci avec listview1 pour upload des fichiers, regarde ce lien il y est intéressent pour upload des fichier en plus il y a une video : upload multiple fichiers

    Je sais pas si ça fonctionne mais c'est un exemple :

    Voici le code :

    Imports System.IO
    
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            If ListBox1.Items.Count > 0 And TextBox1.Text.Length > 0 And TextBox2.Text.Length > 0 And TextBox3.Text.Length > 0 Then
                Dim FTP As String = TextBox1.Text
                Dim Username As String = TextBox2.Text
                Dim Password As String = TextBox3.Text
                For Each fichier As String In ListBox1.Items
                    Try
                        My.Computer.Network.UploadFile(fichier, FTP, Username, Password) MessageBox.Show("Upload correctement effectuer", "ok", MessageBoxButtons.OK, MessageBoxIcon.Information) Catch ex As Exception MessageBox.Show("Erreur Upload du fichier...", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try Next Else MessageBox.Show("Veuillez choisir un ou plusieur(s) fichier valide ou entrer un lien FTP valide ou un username valide ou password valide!", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error) End If End Sub Private Sub ListBox1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragDrop If e.Data.GetDataPresent(DataFormats.FileDrop) Then Dim Files() As String Files = e.Data.GetData(DataFormats.FileDrop) For i As Integer = 0 To Files.Length - 1 ListBox1.Items.Add(Files(i)) Next End If End Sub Private Sub ListBox1_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragEnter If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.All End If End Sub Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load ListBox1.AllowDrop = True ' activer le deplacement des fichier dans listbox1
            TextBox3.UseSystemPasswordChar = True 'cacher le mot de passe End Sub End Class

    j’espère que j'ai bien répondu a votre question,

    Cordialement,




    • Modifié zorro591 lundi 25 décembre 2017 14:41
    lundi 25 décembre 2017 14:24
  • Bonjour, merci d'avoir répondu.

    Mon problème n'est pas encore résolu.

    Ce que vous avez trouvé ne résout pas mon problème, c'est exactement ce que j'ai fais au début, mais je rencontre les même problèmes. Pour les "freeze" que rencontre le logiciel lors de l'upload, ce n'est pas grave, je pense que c'est plus facile à résoudre.

    Mais par exemple je veux upload un fichier de mon disque dur à cet emplacement : "C:\test\fichier.txt",

    et que je veux l'upload dans cet emplacement FTP : "ftp://www.serverftptest.fr/test/fichier.txt",

    mais que le dossier "test" du serveur FTP n'existe pas,

    il faudrait donc le créer, mais il faut que le nom du dossier à créer dans le répertoire ftp soit équivalent au nom du dossier dans l'ordinateur, par exemple créer le dossier "test" dans le répertoire ftp

    car dans le répertoire indiqué par l'utilisateur le répertoire "test" a besoin d'être crée pour le fichier "fichier.txt"

    J'ai une idée qui pourrait marcher, j'utilise My.Settings.location pour désigner l'emplacement de tous les fichiers à upload et est changeable par rapport à ce que met l'utilisateur donc :

    On vérifie dans la boucle si le chemin spécifié dans la liste est : My.Settings.location & un fichier (par exemple : 

    My.Settings.location & "\fichier.txt")

    Ou si c'est My.Settings.location & "\dossier\fichier.txt" (par exemple :

    My.Settings.location & "\dossier\fichier.txt")

    Si c'est la première condition qui est juste, alors on upload le fichier "fichier.txt" simplement dans le répertoire FTP indiquée à l'utilisateur.

    Par exemple : (ce code sera dans la boucle)

    My.Computer.Network.UploadFile(fichier, FTP, Username, Password)

    Si c'est la deuxième condition qui est juste, alors on détecte les dossiers à créer dans le répertoire FTP, puis on créer les dossiers dans le répertoire FTP, puis on upload les fichiers dans le répertoire. 

    Mais je ne sais pas comment le faire.


    mardi 26 décembre 2017 14:01
  • Bonjour,

    j'ai compris ce que vous voulez faire , il faudra essayer avec un seul fichier pour l'instant.

    voici un deuxième exemple pour upload votre fichier :

    Imports System.IO

    Public Class Form1

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Try
                Dim request As System.Net.FtpWebRequest = DirectCast(System.Net.WebRequest.Create("ftp://www.serverftptest.fr/test/fichier.txt"), System.Net.FtpWebRequest)
                request.Credentials = New System.Net.NetworkCredential("username", "password")
                request.Method = System.Net.WebRequestMethods.Ftp.UploadFile
                Dim File() As Byte = System.IO.File.ReadAllBytes("C:\test\fichier.txt")
                Dim UpFile As System.IO.Stream = request.GetRequestStream()
                UpFile.Write(File, 0, File.Length)
                UpFile.Close()
                UpFile.Dispose()
                MessageBox.Show("Fichier(s) téléchargé(s) avec succès", "Traitement terminer", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch ex As Exception
                MessageBox.Show("Erreur de connexion avec le serveur FTP" & vbNewLine & "Essayer de recommencer", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub
    End Class

    pour crée un dossier sur le serveur FTP:

    Imports System.Net
    Imports System.IO

    Public Class Form1

        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            CreationDuDossierFTP("ftp://www.serverftptest.fr/test", "Username", "password")
        End Sub

        Private Sub CreationDuDossierFTP(ByVal URL As String, ByVal User As String, ByVal pass As String)
            Try
                Dim ftp As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(URL), System.Net.FtpWebRequest)
                ftp.Method = WebRequestMethods.Ftp.MakeDirectory
                ftp.UseBinary = True
                ftp.Credentials = New System.Net.NetworkCredential(User, pass)
                Dim response As FtpWebResponse = DirectCast(ftp.GetResponse(), FtpWebResponse)
                Dim ftpStream As Stream = response.GetResponseStream()
                ftpStream.Close()
                response.Close()
                MessageBox.Show("Le dossier à était crée avec succée!", "Creation du dossier", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch ex As Exception
                MessageBox.Show("Erreur de creation du dossier!", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

    End Class

    j’espère que j'ai bien répondu a votre question,

    Cordialement,







    • Modifié zorro591 mardi 26 décembre 2017 15:43
    mardi 26 décembre 2017 15:02
  • J'ai eu une idée.

    Pour créer les dossiers où le fichier est censé se trouver dans son répertoire sur l'ordinateur à upload sur un serveur FTP

    Si on récupérait le dossier parent du fichier en boucle, jusqu'à atteindre le dossier racine (My.Settings.location) et arrivé là on "retourne en arrière" et on créer le dossier sur le serveur FTP puis on "retourne en arrière", puis on créer le dossier sur le serveur FTP etc...

    (Si je dis "retourne en arrière" c'est pour éviter que les dossiers se créé à l'envers, par exemple On veut créer le dossier "test" qui est le dossier parent du fichier "test.txt", qui est lui-même dans le dossier "projets". Si jamais on ne "retournais pas en arrière" alors le dossier "projets" serait créer dans le dossier "test", ce qui n'est pas dans le bon sens, c'est plutôt le dossier "test" qui est dans le dossier "projets".

    J'ai essayer de faire ceci : cela ne marche pas mais c'est un début :

                    If FileUploadingList.Items.Count > 0 And TransfertHost.Text.Length > 0 And TransfertUser.Text.Length > 0 And TransfertUser.Text.Length > 0 Then
                        'récupération des données entrées par l'utilisateur
                        Dim FTP As String = TransfertHost.Text
                        Dim Username As String = TransfertUser.Text
                        Dim Password As String = TransfertPassword.Text
    
                        'upload des fichiers de la liste FileUploadingList
                        For Each fichier As String In FileUploadingList.Items
                            File = fichier.ToString.Split(New String() {My.Settings.location & "\"}, StringSplitOptions.None)(1)
                            File.Replace("\", "/")
    
                            Try 'Essai d'upload d'un fichier de la liste
                                My.Computer.Network.UploadFile(fichier, FTP & File, Username, Password)
                            Catch ex As Exception 'Si jamais cela ne marche pas, alors il va essayer de récupérer le nom du dossier avec une boucle qui vérifie jusqu'à ce que le dossier parent = Au dossier du serveur
                                Try
                                    Dim lStr As String = File
                                    Dim lDossierNom As String
                                    Do While lDossierNom = File
                                        lDossierNom = IO.Path.GetFileName(IO.Path.GetDirectoryName(lStr))
                                        lStr = lDossierNom
                                    Loop
    
                                    MessageBox.Show(lDossierNom) ' Affiche "Test1"
    
                                Catch ex2 As Exception
                                    MessageBox.Show("Erreur de connexion avec le serveur FTP" & vbNewLine & "Essayer de recommencer" & vbNewLine & ex2.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                                End Try
                            End Try
                        Next
    
                    Else
                        MessageBox.Show("Veuillez choisir un ou plusieur(s) fichier valide ou entrer un lien FTP valide ou un username valide ou password valide!", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End If

    mardi 26 décembre 2017 18:34
  • Bonsoir,

    avant aller plus loin dans les détails.

    je voudrais savoir dans votre serveur FTP que le fichier texte existe dans le dossier test?

    il faudra vérifier dans le serveur FTP du lien est-il bon, le dossier test existe, fichier texte aussi..etc

    Cordialement,


    mardi 26 décembre 2017 19:39
  • Bonsoir,

    Lors de l'upload, il faut supposer que le serveur FTP indiqué par l'utilisateur est vide. Donc aucun fichier n'y est présent, donc il faut créer absolument tous les répertoires.

    Mais comment je fais pour vérifier si un dossier existe et si un fichier existe sur le serveur FTP ?


    mardi 26 décembre 2017 19:55
  • Bonjour,

    Il n'y a pas de méthode toute faite pour tester l'existence d'un dossier sur un ftp.

    C'est pour cela que j'essaye de lister le contenu du dossier (avec WebRequestMethods.Ftp.ListDirectory ), si cela fonctionne alors le dossier existe, sinon ... ben il n'existe pas.

    Voici le code comment faire lister les fichier(s) et les dossier(s) sur le serveur FTP :

    Imports System.Net
    Imports System.IO
    
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Try
                Dim ftp As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create("ftp://www.serverftptest.fr/"), System.Net.FtpWebRequest)
                ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails
                ftp.Credentials = New System.Net.NetworkCredential("Username", "Password")
                Dim response As FtpWebResponse = DirectCast(ftp.GetResponse(), FtpWebResponse)
                Dim ftpStream As Stream = response.GetResponseStream()
                Dim reader As StreamReader = New StreamReader(ftpStream)
                RichTextBox1.AppendText(reader.ReadToEnd)
                RichTextBox1.AppendText(response.StatusDescription)
                reader.Close()
                response.Close()
                MessageBox.Show("Liste de répertoire terminée", "Lecture", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch ex As Exception
                MessageBox.Show("Erreur de connexion avec le serveur FTP" & vbNewLine & "Essayer de recommencer" & vbNewLine & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub
    End Class

    j’espère que j'ai bien répondu a votre question,

    Cordialement,

    mercredi 27 décembre 2017 08:42
  • Bonjour,

    J'ai compris ce que vous voulez faire, mais je n'ai pas trop compris ce code.

    Voilà le résultat que ça m'a fait :

    drwxr-xr-x    2 116475646  u116475646       4096 Dec 26 17:43 .
    drwxr-xr-x    3 116475646  u116475646       4096 Dec 26 17:41 ..
    226-Options: -a -l 
    226 2 matches total
    

    À quoi correspond tout ça ?

    mercredi 27 décembre 2017 11:11
  • Bonjour,

    Voici en tuto comment crée un dossier FTP depuis votre PC: Serveur FTP

    Voici ce que ça me donne :

    ça fonctionne très bien chez moi. j' arrive a lister les fichier(s) dans le dossier que j'ai crée.

    Cordialement,

    mercredi 27 décembre 2017 11:34
  • Bonjour,

    Je vais créer le serveur FTP mais en principe c'est l'utilisateurs qui doit renseigner les informations de son serveur FTP.

    Donc si j'ai bien compris votre code, il permet de lister les dossiers d'un répertoire FTP indiqué ?

    Mais comme j'ai indiqué un serveur FTP de test qui est vide, alors il ne peut rien lister ?

    mercredi 27 décembre 2017 12:09
  • Bonjour,

    es ce que le problème est-il résolu?

    Cordialement,

    jeudi 28 décembre 2017 12:45
  • Non pas du tout, je n'arrive pas à faire ce que je veux, malgré tous vos conseils.


    jeudi 28 décembre 2017 18:45