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

Python Discussion :

Upload de fichier sur un serveur FTP mais à quelle vitesse ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut Upload de fichier sur un serveur FTP mais à quelle vitesse ?
    Bonjour à tous.

    Voilà j'upload sur mon serveur des fichiers assez gros à l'aide de la librairie ftplib. Jusqu'ici aucun problème ça fonctionne parfaitement.

    Mais voilà j'aimerai améliorer mon code afin de connaitre le débit qui est utilisé pour uploader mes fichiers et pourquoi pas faire en sorte d'afficher en temps réel le temps qu'il me reste pour que le fichier soit totalement uploadé.

    Je ne sais pas si une fonction ou une classe existe pour faire ça, car dans la doc cela n'est pas indiqué : ftplib-FTP protocol client

    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Je reviens avec un bout de code trouvé sur le net.

    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
     
    class FtpUploadTracker:
        sizeWritten = 0
        totalSize = 0
        lastShownPercent = 0
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
     
        def handle(self, block):
            self.sizeWritten += 1024
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
     
            if (self.lastShownPercent != percentComplete):
                self.lastShownPercent = percentComplete
                print(str(percentComplete) + " percent complete")
    J'ai essayé de l'intégrer à mon code mais j'ai une erreure qui me dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Applications/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
        execfile(filename, namespace)
      File "/Users/Developpement/Python/Upload_Progress/Upload_Progress.py", line 36, in <module>
        ftp.storbinary('STOR test.zip', file, 1024, uploadTracker.handle)
    NameError: name 'ftp' is not defined
    ci dessous le code qui donne l'erreur.

    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
     
    import ftplib
    totalSize = 0
     
    class FtpUploadTracker:
        sizeWritten = 0
        totalSize = 0
        lastShownPercent = 0
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
     
        def handle(self, block):
            self.sizeWritten += 1024
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
     
            if (self.lastShownPercent != percentComplete):
                self.lastShownPercent = percentComplete
                print(str(percentComplete) + " percent complete")
     
     
     # Connect
    s = ftplib.FTP('hôte','login','pass')
     
    # file to send
    f = open('test.zip','rb')                
    uploadTracker = FtpUploadTracker(int(totalSize))
     
    # Send the file
    ftp.storbinary('STOR test.zip', file, 1024, uploadTracker.handle) 
     
    # Close file and FTP
    f.close()
    s.quit()
    Je ne comprend pas pourtant j'importe bien la lib ftplib dés le départ.

    Une idée ?

    Merci d'avance pour vos réponses.

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Le "ftp" inconnu est le résultat de "ftplib.FTP('hôte','login','pass')". Il faut donc corriger la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ftp = ftplib.FTP('hôte','login','pass')
    Ainsi que la dernière ligne s.quit() => ftp.quit()

    Je n'ai pas regardé le code dans le détail, mais globalement, la méthode est bonne.

  4. #4
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Le "ftp" inconnu est le résultat de "ftplib.FTP('hôte','login','pass')". Il faut donc corriger la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ftp = ftplib.FTP('hôte','login','pass')
    Ainsi que la dernière ligne s.quit() => ftp.quit()

    Je n'ai pas regardé le code dans le détail, mais globalement, la méthode est bonne.
    Je venais juste de le voir et effectivement j'avais trouvé l'erreur à ligne 30 :

    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
     
    import ftplib
    totalSize = 0
     
    class FtpUploadTracker:
        sizeWritten = 0
        totalSize = 0
        lastShownPercent = 0
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
     
        def handle(self, block):
            self.sizeWritten += 1024
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
     
            if (self.lastShownPercent != percentComplete):
                self.lastShownPercent = percentComplete
                print(str(percentComplete) + " percent complete")
     
     
     # Connect
    s = ftplib.FTP('hôte','login','pass')
     
    # file to send
    f = open('test.zip','rb')                
    uploadTracker = FtpUploadTracker(int(totalSize))
     
    # Send the file
    s.storbinary('STOR test.zip', file, 1024, uploadTracker.handle) 
     
    # Close file and FTP
    f.close()
    s.quit()
    Par contre cette fois ci j'ai un soucis car il me met ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Applications/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
        execfile(filename, namespace)
      File "/Users/mohamed/Developpement/Python/Upload_Progress/Upload_Progress.py", line 35, in <module>
        s.storbinary('STOR test.zip', f, 1024, uploadTracker.handle) 
      File "/Applications/anaconda/python.app/Contents/lib/python2.7/ftplib.py", line 476, in storbinary
        if callback: callback(buf)
      File "/Users/mohamed/Developpement/Python/Upload_Progress/Upload_Progress.py", line 21, in handle
        percentComplete = round((self.sizeWritten / self.totalSize) * 100)
    ZeroDivisionError: integer division or modulo by zero
    Je comprend qu'au départ la valeur de totalSize est également à zero mais ne devrait elle pas valoir la taille du fichier qui est entrain d'être uploadé ? Car à aucun moment je ne vois cette valeur intervenir.

    encore merci.

  5. #5
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Je me répond à moi même

    effectivement il faut à un moment définir la taille du fichier qui va être uploadé afin de savoir où en est l'upload.

    Donc du coup j'ai rajouté cette ligne afin de savoir la taille du fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    totalSize = os.path.getsize('test.zip')
    Le code devient donc :

    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
     
    import ftplib
     
    class FtpUploadTracker:
        sizeWritten = 0
        totalSize = os.path.getsize('test.zip')
        lastShownPercent = 0
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
     
        def handle(self, block):
            self.sizeWritten += 1024
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
     
            if (self.lastShownPercent != percentComplete):
                self.lastShownPercent = percentComplete
                print(str(percentComplete) + " percent complete")
     
     
     # Connect
    s = ftplib.FTP('hôte','login','pass')
     
    # file to send
    f = open('test.zip','rb')                
    uploadTracker = FtpUploadTracker(int(totalSize))
     
    # Send the file
    s.storbinary('STOR test.zip', file, 1024, uploadTracker.handle) 
     
    # Close file and FTP
    f.close()
    s.quit()
    Cependant j'ai toujours le même message d'erreur. J'ai ajouté un print à la ligne précédent la division par zéro comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def handle(self, block):
            self.sizeWritten += 1024
            print self.totalSize
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
    et effectivement ça me renvoie self.totalSize = 0.

    Une idée ?

    Encore merci

  6. #6
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Bon j'ai trouvé pourquoi ça ne fonctionnait pas

    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
     
    import ftplib
    import os
    totalSize = os.path.getsize('test.zip')
     
    class FtpUploadTracker:
        sizeWritten = 0
     
        print('Total file size : ' + str(round(totalSize / 1024 / 1024 ,1)) + ' Mb')
        lastShownPercent = 0
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
     
        def handle(self, block):
            self.sizeWritten += 1024
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
     
            if (self.lastShownPercent != percentComplete):
                self.lastShownPercent = percentComplete
                print(str(percentComplete) + " percent complete")
     
    # Connect
    s = ftplib.FTP('ftpperso.free.fr','mohamed.nekkache','UZBgto02')
     
    # file to send
    f = open('test.zip','rb')                
    uploadTracker = FtpUploadTracker(int(totalSize))
     
    # Send the file
    s.storbinary('STOR test.zip', f, 1024, uploadTracker.handle) 
     
    # Close file and FTP
    f.close()
    s.quit()
    il fallait initialiser la valeur de totelSize en dehors de la classe. Je ne mis connait pas trop en classe donc ...

    Cependant le résultat est loin d'être celui que je voulais obtenir.

    Durant l'upload je n'ai plus la main et je ne vois pas l'avancement en temps réel de mon upload (0%, 1%, 2% ...... 100%). Je récupère uniquement à la fin de l'upload le 100 percent complete.

    Dés que je récupère la main je comprend bien que l'upload est terminé

    Donc finalement ça répond pas à ma problématique de départ

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    J'ai corrigé un peu ton code, mais je ne l'ai pas essayé. Il devrait afficher le % d'avancement:

    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
    import os
    import ftplib
     
    class FtpUploadTracker:
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
            self.sizeWritten = 0
     
        def handle(self, block):
            self.sizeWritten += len(block)
            if self.sizeWritten < self.totalSize:
                percentComplete = round((self.sizeWritten / self.totalSize) * 100)
                print("progression= %f3.2" % percentComplete)
            else:
                print("upload terminé")
     
     # Connect
    ftp = ftplib.FTP('hôte', 'login', 'pass')
     
    # file to send
    fichier = 'test.zip'
    totalSize = os.path.getsize(fichier)
    f = open(fichier, 'rb')
    uploadTracker = FtpUploadTracker(totalSize)
     
    # Send the file
    ftp.storbinary('STOR ' + fichier, f, 1024, uploadTracker.handle)
     
    # Close file and FTP
    f.close()
    ftp.quit()

  8. #8
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    J'ai corrigé un peu ton code, mais je ne l'ai pas essayé. Il devrait afficher le % d'avancement:

    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
    import os
    import ftplib
     
    class FtpUploadTracker:
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
            self.sizeWritten = 0
     
        def handle(self, block):
            self.sizeWritten += len(block)
            if self.sizeWritten < self.totalSize:
                percentComplete = round((self.sizeWritten / self.totalSize) * 100)
                print("progression= %f3.2" % percentComplete)
            else:
                print("upload terminé")
     
     # Connect
    ftp = ftplib.FTP('hôte', 'login', 'pass')
     
    # file to send
    fichier = 'test.zip'
    totalSize = os.path.getsize(fichier)
    f = open(fichier, 'rb')
    uploadTracker = FtpUploadTracker(totalSize)
     
    # Send the file
    ftp.storbinary('STOR ' + fichier, f, 1024, uploadTracker.handle)
     
    # Close file and FTP
    f.close()
    ftp.quit()
    Merci pour tes modifications c'est un peut plus clair en plus

    Mais voilà quand je le lance voilà ce qu'il me renvoie durant l'upload :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    upload terminé
    Tu lui demande d'afficher quoi exactement avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("progression= %f3.2" % percentComplete)
    C'est le %f3.2 que je ne comprend pas.

    encore merci de ton aide.

Discussions similaires

  1. Envoyer un fichier sur un serveur FTP par proxy
    Par Tierisa dans le forum Access
    Réponses: 4
    Dernier message: 13/12/2005, 16h39
  2. Envoi de fichier sur un serveur FTP
    Par pepe2006 dans le forum Access
    Réponses: 6
    Dernier message: 02/12/2005, 10h19
  3. Upload de fichier sur le serveur
    Par krfa1 dans le forum ASP
    Réponses: 9
    Dernier message: 29/11/2005, 13h50
  4. Réponses: 4
    Dernier message: 15/09/2005, 13h27
  5. [FTP] Test de l'existence d'un fichier sur un serveur ftp
    Par lapartdombre dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 01/08/2005, 14h13

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