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 :

Transmission d'un fichier en ftp mais en mode binary


Sujet :

VB.NET

  1. #1
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut Transmission d'un fichier en ftp mais en mode binary
    Bonjour,

    Actuellement je développe un petit programme pour automatiser une procédure de mise à jour d'un petit serveur linux.

    J'effectue des opérations sur le port COM, sa c'est bon.
    Et je dois envoyer l'image Linux par ftp.


    J'arrive sans souci a me connecter en ftp mais impossible d'envoyer le fichier. Sur le serveur il est bien présent mais avec 0 octet et j'ai une erreur de transmission.

    Je suppose que c'est le fait qu'il faut passer le serveur en mode binaire.

    Les commandes que je dois effectuées avec un terminal Windows en mode ftp sont:
    (A partir du répertoire ou se trouve linux.bin bien sur)


    cd /home
    bin
    put linux.bin


    Merci de votre aide

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il y a des classes dans le framework pour dialoguer avec un serveur ftp

    http://archive.loicrebours.fr/index....ndes-ftp-en-c/
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    il y a des classes dans le framework pour dialoguer avec un serveur ftp

    http://archive.loicrebours.fr/index....ndes-ftp-en-c/

    Merci Pol63, j'était partie avec du code trouvé bien plus complexe, je vais étudier cela, merci encore.

  4. #4
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    J'ai un petit souci avec ce que j'ai adapté.

    Voici mon code pour envoyer le fichier linux.bin en ftp

    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
     
     Public Sub ftpConnect()
     
            Try
                Dim myadress As String = "ftp://" & "192.168.42.20 & "/home/linux.bin"
                Dim serverUri As Uri = New Uri(myadress)
                If serverUri.Scheme <> Uri.UriSchemeFtp Then
                    Return
                End If
                Dim myRequest As FtpWebRequest = DirectCast(WebRequest.Create(serverUri), FtpWebRequest)
                myRequest.Credentials = New NetworkCredential(iniLogin, iniPass)
                myRequest.Method = WebRequestMethods.Ftp.UploadFile
                myRequest.UsePassive = True
                myRequest.UseBinary = True
                myRequest.KeepAlive = False
                Dim File() As Byte = System.IO.File.ReadAllBytes(LinuxFile) 'LinuxFile = D:\linux.bin
                Dim UpFile As System.IO.Stream = myRequest.GetRequestStream()
     
                UpFile.Write(File, 0, File.Length)
                UpFile.Close()
                UpFile.Dispose()
     
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
     
        End Sub
    Cela plante sur UpFile.Write(File, 0, File.Length)

    Le message lors de l’exception est:
    The underlying connection was closed: un unexpected error occurred on a receive
    Le ex.Tostring m'indique:


    En ligne 338 c'est UpFile.Close() mais il ne si arrête pas !!

    J'ai testé avec : Dim myadress As String = "ftp://" & "192.168.42.20 & "/home"
    sans mettre linux.bin mais la il me dit que je n'est pas donner de nom au fichier.


    Mais il me semble qu'il a fonctionné 1 fois car j'ai fait plein d'essaie mais la plus rien. Je précise que je reset complètement le serveur Linux à chaque fois car c'est le reste qui lance ma procédure d’écoute du port COM.

    Le serveur linux m'envoie sur le port COM immediatemetn aprés le : UpFile.Write(File, 0, File.Length)
    fault-common.c 387
    Unhandled fault: external abort on line(F4) at 0x00000001
    fault-common.c(97): start_code=0x308040, start_stack=0x335f64


    Une fois que cela fonctionnera!!! j'aimerai savoir s'il y a un moyen de connaitre son avancement car il faut plus d'une minute pour transférer le fichier et l’opérateur risque de s'impatienter.

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    en 1er lieu je testerais en fonction de keepalive et usepassive
    sinon quel est le type de l'exception ? y a t il une innerexception ?

    sinon il y a la classe webclient aussi qui elle a des évènements de progression et doit fonctionner sur du ftp, par contre pas sûr qu'on puisse dire binary, mais ca reste à essayer
    sinon il faut faire write dans une boucle avec x octets et donc à chaque tour de bouble tu pourras connaitre la progression, le tout avec backgroundworker pour être sur un autre thread et avoir des events de progression
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Merci encore Pol63 je vais suivre tes conseils.

    Le petit serveur linux plante parfois sans raison aussi lorsque l'on utilise les commandes dans un terminal pour ce transfert ftp. Mais la c'est immédiat ou presque et le serveur n'a pas l'air d'être bloqué, j'arrive encore à faire du telnet dessus.

    Merci pour l'idée du Write en boucle, tout bête mais je n'y est pas pensé.


    [edit]
    Je ne sais pas exactement ce que vous voulez dire par type d’exception. Sur l’erreur, catch, en titre c'est noté "Interception de WebException"


    Je viens de jouer avec UsePassive et KeepAlive mais cela change rien.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par megamario Voir le message
    Je ne sais pas exactement ce que vous voulez dire par type d’exception. Sur l’erreur, catch, en titre c'est noté "Interception de WebException"
    le type est webexception dans ton cas
    quand on arrive dans le catch c'est qu'une exception a été généré par un throw new typeexception(paramètres) (le framework .net est codé en grande partie en .net)

    dans le catch ex est une instance avec un type, pour connaitre le type on fait ex.gettype.fullname
    il y a un message dans ex.message et la pile des appels dans ex.stacktrace (il serait aussi interressant de l'avoir dans ton cas, pour voir dans quelle méthode du framework ca plante)

    parfois dans un catch on redéclenche une nouvelle exception, pour garder la 1ère on la met dans la propriété innerexception (enfin je parle surtout du framework)
    ce qui veut dire que ex est la dernière exeception générée, mais une autre est apparue avant causant la 1ère, il convient donc de regarder ex.innerexception (type, message, stacktrace aussi)
    et ceci de manière récursive car une innerexception est une exception et peut donc avoir une innerexecption

    de plus dans msdn pour chaque méthode microsoft a listé les types d'exception possible (ioexecption, webexecption, stackoverflowexception ...) avec des fois les causes possibles


    edit:
    d'après msdn
    FtpWebRequest.GetRequestStream, méthode
    WebException Une connexion au serveur FTP n'a pas pu être établie.

    ca se trouve c'est juste un problème de connexion, essaye avec filezilla (client ftp connu) pour voir si ca marche ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Merci pour toutes ces infos.

    Voici ce que j’obtiens



    par contre si je fait la même chose avec ex.InnerException.GetType.FullName etc.. j'ai un plantage.

    Je regarde sa demain en détail si j'ai loupé un truc dans vos explications.

    Bonne soirée.

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    innerexception peut etre nothing dans ce cas innerexception.quelque chose plante comme tout accès à quelque chose qui n'existe pas

    j'ai édité mon message précédent, avez vous testé avec un client ftp standard ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Bonsoir,

    Je n'est effectivement pas testé s'il était nothing ou pas mais j'en ai déduit qu'il y avait effectivement se test à faire. Mais je vous remercie encore pour toutes ces infos je ne les connaissais pas.

    En ce qui concerne le test avec un client ftp j'ai effectivement testé avec filezilla. Mais j'ai testé la connexion mais pas le transfert. Je teste sa demain.


    Bonne soirée.

  11. #11
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Bonjour,

    Je viens de tester le transfert de donnée avec fillezila. Mais il plante aussi, par contre uniquement à la fin, la barre progression va jusqu'à 100%. puis indique une erreur. Le fichier est bien présent sur le serveur mais pas de la taille qu'il devrait, il manque quelque données.
    J'ai retenté avec le terminal Windows et la aussi cela plante. Le serveur à un souci.



    Je viens de réinitialisé complètement le serveur à partir de la plateforme de développement et je recommence les essaies. Installation usine de Net_OS fourni par DIGI (Configuration identique à la réception), puis installation de l'ancien Linux (version à mettre à jour par mon logiciel)

    Filezilla plante toujours à la fin(mode de transmission binaire). Mais avec le terminal Windows cela fonctionne de nouveau. Il est bien capricieux ce serveur!!!

    Mon logiciel plante toujours lui aussi.....

    EDIT:

    J'allais noter le message d'erreur de filezilla, mais la le transfert c'est bien passé...C'est vraiment pas fiable...

    Il semble moins perturbé par les commandes effectuées sous le terminal windows. Est-ce possible d'automatiser cela?

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il y a des commandes dos permettant de faire du ftp, j'ai déjà vu des développeurs utiliser ca à l'époque de vb6
    donc oui ca doit etre faisable
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Bonjour Pol63,

    Je viens d’essayer avec WebClient et cela fonctionne apparemment je vais faire plusieurs essaies.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim client As New WebClient
    Dim ftpFilename As String = "ftp://" & iniIP & "/home/linux.bin"
    client.Credentials = New NetworkCredential(iniLogin, iniPass)
    Dim responseArray As Object = client.UploadFile(ftpFilename, LinuxFile)
    A voir...

    Pour le moment pas de gestion de la progression du transfert, mais sa c'est secondaire. Merci pour les pistes..

  14. #14
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pour la progression : addhandler client.event, addressof sub (penser au removehandler)
    y a un event pour progress et un event pour fini (et surement un event pour erreur si l'event fini ne sert pour le cas d'erreur)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Ma progression ne fonctionne pas, mais l'envoie du fichier à l'air de passer à chaque fois, cela me rassure.

    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
      Public Sub ftpConnect()
       Try
          Dim ftpFilename As String = "ftp://" & iniIP & "/home/linux.bin"
          AddHandler client.UploadProgressChanged, AddressOf UploadProgressCallback
          client.Credentials = New NetworkCredential(iniLogin, iniPass)
     
          Dim responseArray As Object = client.UploadFile(ftpFilename, LinuxFile)
     
          RemoveHandler client.UploadProgressChanged, AddressOf UploadProgressCallback
      Catch ex As Exception
          MsgBox("ex.GetType.FullName = " & vbCrLf & ex.GetType.FullName & vbCrLf & vbCrLf & _
                                  "ex.Message = " & vbCrLf & ex.Message & vbCrLf & vbCrLf & _
                                  "ex.StackTrace = " & vbCrLf & ex.StackTrace)
       End Try
    End Sub
     
    Private Sub UploadProgressCallback(ByVal sender As Object, ByVal e As UploadProgressChangedEventArgs)
            _FormMain.myProgressUpload(e.ProgressPercentage)
    End Sub
    Je ne passe jamais dans UploadProgressCallback.

    Je continue à chercher

  16. #16
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    la progression n'est faite qu'en cas de transfert asynchrone
    actuellement ton code bloque sur la ligne upload jusqu'à la fin du fichier

    http://msdn.microsoft.com/fr-fr/libr...vs.110%29.aspx
    avec la méthode asynchrone le code ne bloque pas et continue dans la sub pendant qu'il démarre l'envoi
    là les évènements seront levés et pourront d'ailleurs être traités, quand le thread principal est bloqué il ne peut pas traité d'évènements (et l'interface freeze d'ailleurs car les events de rafraichissements sont bloqués aussi)
    par contre vu que le code continu il ne faut pas faire le removehandler ici, il faut le faire quand l'envoi est terminé et que tu n'as plus besoin de l'instance de webclient
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    J'arrive maintenant à avoir une progression en utilisant la méthode UploadFileAsync.

    Mais lorsque tout fonctionne, le pourcentage s’arrête à 50% au moment du déclenchement de l’événement UploadFileCompleted.

    Et lorsque cela plante, cela fait un peu comme avec fileZilla, c'est a dire que je vais a 48 ou 49% et la cela s’arrête mais pas d’événement. Ou du moins je n'est pas trouvé celui qui était lancé.

    A la suite de ce blocage j'ai laissé le soft tourner et au bout de plus de 20 minutes, l'événement UploadProgressChanged c'est activé de nouveau avec comme pourcentage 100% suivi ensuite de l'événement UploadFileCompleted comme si rien ne c’était passé. Je n'arrive pas a voir si une erreur c'est déclenché. Mais le fichier semble complet sur le serveur.

  18. #18
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [Python 2.X] Upload de fichier sur un serveur FTP mais à quelle vitesse ?
    Par nekcorp dans le forum Général Python
    Réponses: 36
    Dernier message: 31/10/2014, 16h57
  2. [2008] Non réception de fichiers en FTP mais pas d'erreur
    Par StitchP dans le forum SSIS
    Réponses: 0
    Dernier message: 05/10/2012, 10h42
  3. fichier .xml via ftp mais file_put_contents le tronque
    Par Garra dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 15/09/2011, 13h29
  4. Envoi de fichier par FTP mais nommé différent
    Par whorian dans le forum VB.NET
    Réponses: 2
    Dernier message: 08/03/2009, 17h04

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