Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TÉLÉCHARGEMENT D'UN FICHIER V1.1


Information sur la source

Catégorie :Réseau & Internet Niveau : Initié Date de création : 03/03/2002 Date de mise à jour : 06/03/2002 22:15:59 Vu / téléchargé: 8 573 / 1 548

Note :
9,5 / 10 - par 14 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

Description

Une OCX pour télécharger un fichier avec Inet.
un evenement vous permet de recuperer la taille deja telechargee, la taille totale, le pourcentage, la vitesse (quoiqu'il y a quelques progres a faire de ce cote)
Un autre le status du téléchargement.

Le code est commenté et contient un projet de test.

Vous pouvez retoucher le code et l'inclure ds votre projet, ajout le controle, ou ajouter l'ocx (je sais, c chiant a distribuer ;-)    
 

Source

  • 'Control : OCX_Download
  • 'Auteur : Emmanuel Bouillon
  • 'E-mail : ebouillon@ifrance.com
  • 'Page perso : http://informatique.monhttp.com/
  • 'Dernière MAJ : 06/03/2002
  • 'Version Act : 1.1
  • '
  • 'V 1.1:
  • ' -- Support du resuming (ajout d'un argument a la fonction Download)
  • ' -- un bug corrigé
  • '
  • 'A venir:
  • ' -- Une meilleur gestion de la vitesse
  • ' -- Le temps
  • ' -- Un controle d'erreur
  • 'J'ai rajouté plusieurs boucles avec Inet.StillExecuting
  • 'pour etre sur que le control n'est pas en train de faire qqc
  • 'Génere une erreur si il y a une variable inconnue
  • Option Explicit
  • 'Défini les evenements
  • Public Event Progress(Percent As Byte, Taille_Recue As Long, Taille_Totale As Long, Vitesse As Long)
  • Public Event ChangementStatus(State As String)
  • Const Chunk_Size = 1024
  • Const Retour = 4096
  • Dim Pourcent As Byte
  • Dim Taille_Recue As Long
  • Dim Taille_Totale As Long
  • Dim Vitesse As Long
  • Dim LastTailleRecue As Long
  • Dim File As Integer
  • Dim StrHeader
  • Dim Msg
  • Dim Data() As Byte
  • 'Procedure de téléchargement
  • Public Sub Download(Source As String, Destination As String, Optional AutoResume As Boolean = True)
  • 'En cas d'erreur, aller a l'etiquette "ErreurDownload"
  • 'On Error GoTo ErreurDownload
  • 'Initialise les variables
  • Pourcent = 0
  • Taille_Recue = 0
  • Taille_Totale = 0
  • Vitesse = 0
  • LastTailleRecue = 0
  • File = 0
  • StrHeader = ""
  • 'Envoi l'evenement "ChangementStatus" avec pour argument le Status
  • RaiseEvent ChangementStatus("Initialisation...")
  • Lbl_Status = "Initialisation..."
  • RaiseEvent Progress(0, 0, 1, 0)
  • 'Attends qu'il ai terminé ses operations
  • While Inet.StillExecuting
  • DoEvents
  • Wend
  • 'Initialise le controle Internet Transfert
  • Inet.URL = Source
  • Inet.Execute , "GET"
  • 'Attends qu'il ai terminé ses operations
  • While Inet.StillExecuting
  • DoEvents
  • Wend
  • Lbl_Source = "Source : " & Source
  • Lbl_Destination = "Destination : " & Destination
  • RaiseEvent ChangementStatus("Recherche de la taille du fichier...")
  • Lbl_Status = "Recherche de la taille du fichier..."
  • 'Utilise la fonction Taille pour récuperer la taille du fichier
  • Taille_Totale = Taille(Source)
  • Bar.Max = Taille_Totale
  • Taille_Recue = 0
  • Bar.Value = Taille_Recue
  • RaiseEvent ChangementStatus("Ouverture du fichier de destination...")
  • Lbl_Status = "Ouverture du fichier de destination..."
  • 'Cherche un no de fichier libre
  • File = FreeFile()
  • 'Ouverture du fichier de destination
  • Open Destination For Binary Access Write As #File
  • 'Si le fichier de destination existe deja :
  • If FileLen(Destination) > 4096 Then
  • If AutoResume = False Then Msg = MsgBox("Le fichier de destination existe déja, voulez-vous continuer le transfert ?", vbYesNoCancel, "Le fichier de destination existe déja")
  • 'Si AutoResume est sur False, on demande si il faut reprendre le téléchargement
  • If Msg = vbNo Then 'Si non, on ferme le fichier de destination,
  • Close #File 'On le supprime et on le créé
  • Kill Destination
  • Open Destination For Binary Access Write As #File
  • End If
  • If Msg = vbCancel Then 'Si "cancel",
  • GoTo Fin 'on arrete le téléchargement
  • End If
  • 'Si AutoResume est sur True
  • 'ou si on a chosit de continuer
  • 'le téléchargement...
  • If AutoResume = True Or Msg = vbYes Then
  • RaiseEvent ChangementStatus("Reprise du téléchargement...")
  • Taille_Recue = FileLen(Destination)
  • Seek #File, Taille_Recue + 1
  • Inet.Execute , "GET", , "Range: bytes=" & CStr(Taille_Recue) & "-" & vbCrLf
  • End If
  • End If
  • 'Attends qu'il ai terminé ses operations
  • While Inet.StillExecuting
  • DoEvents
  • Wend
  • 'Debut du téléchargement
  • RaiseEvent ChangementStatus("Téléchargement en cours...")
  • Lbl_Status = "Téléchargement en cours..."
  • Timer.Enabled = True 'Activation du Timer (pour la vitesse)
  • Do
  • DoEvents 'Télécharge un bloc de données
  • Data = Inet.GetChunk(Chunk_Size, icByteArray)
  • Put #File, , Data 'Les enregistre dans le fichier
  • Taille_Recue = Taille_Recue + UBound(Data, 1) + 1
  • Bar.Value = Taille_Recue 'Met a jour la bar de progression
  • Lbl_State = Taille_Recue & " / " & Taille_Totale & " - " & Pourcent & " %"
  • Pourcent = Round(Taille_Recue / Taille_Totale * 100)
  • 'Calcule la progression
  • RaiseEvent Progress(Pourcent, Taille_Recue, Taille_Totale, Vitesse)
  • Loop While UBound(Data, 1) > 0
  • 'Ferme le fichier
  • Close #File
  • Timer.Enabled = False
  • RaiseEvent ChangementStatus("Téléchargement terminé")
  • Lbl_Status = "Téléchargement terminé"
  • Exit Sub
  • 'En cas d'erreur
  • ErreurDownload:
  • On Error Resume Next
  • If MsgBox("Erreur " & Err.Number & " - " & Err.Description & vbCrLf & "Effacer le fichier ?", vbYesNo, "Le téléchargement a échoué") = vbYes Then Kill Destination
  • Fin:
  • RaiseEvent ChangementStatus("Une erreur c'est produite !")
  • Lbl_Status = "Une erreur c'est produite !"
  • Close #File
  • End Sub
  • 'Defini la vitesse
  • Private Sub Timer_Timer()
  • Vitesse = (Taille_Recue - LastTailleRecue) * 2
  • LastTailleRecue = Taille_Recue
  • End Sub
  • 'Retrouve la taille d'un fichier sur internet
  • 'Cette fonction peut être appelée sans necessiter
  • 'un téléchargement, car elle utilise un control Inet
  • 'différent
  • Public Function Taille(URL As String) As Long
  • Inet_Taille.URL = URL
  • Inet_Taille.Execute , "GET"
  • 'Fait patienter le control Inet jusqu'a ce qu'il
  • 'ait terminé ses taches
  • While Inet_Taille.StillExecuting
  • DoEvents
  • Wend
  • 'Cherche la taille
  • StrHeader = Inet_Taille.GetHeader("Content-Length")
  • Taille = Val(StrHeader)
  • End Function
  • 'Arrete les operations des controls Inet en cours
  • Public Sub Cancel()
  • On Error Resume Next
  • Inet.Cancel
  • Inet_Taille.Cancel
  • RaiseEvent ChangementStatus("Téléchargement interrompu")
  • Lbl_Status = "Téléchargement interrompu"
  • Timer.Enabled = False
  • End Sub
'Control      : OCX_Download
'Auteur       : Emmanuel Bouillon
'E-mail       : ebouillon@ifrance.com
'Page perso   : http://informatique.monhttp.com/
'Dernière MAJ : 06/03/2002
'Version Act  : 1.1
'
'V 1.1:
'   -- Support du resuming (ajout d'un argument a la fonction Download)
'   -- un bug corrigé
'
'A venir:
'  -- Une meilleur gestion de la vitesse
'  -- Le temps
'  -- Un controle d'erreur

'J'ai rajouté plusieurs boucles avec Inet.StillExecuting
'pour etre sur que le control n'est pas en train de faire qqc

'Génere une erreur si il y a une variable inconnue
Option Explicit

'Défini les evenements
Public Event Progress(Percent As Byte, Taille_Recue As Long, Taille_Totale As Long, Vitesse As Long)
Public Event ChangementStatus(State As String)

Const Chunk_Size = 1024
Const Retour = 4096

Dim Pourcent As Byte
Dim Taille_Recue As Long
Dim Taille_Totale As Long
Dim Vitesse As Long
Dim LastTailleRecue As Long
Dim File As Integer
Dim StrHeader
Dim Msg
Dim Data() As Byte

'Procedure de téléchargement
Public Sub Download(Source As String, Destination As String, Optional AutoResume As Boolean = True)
   'En cas d'erreur, aller a l'etiquette "ErreurDownload"
   'On Error GoTo ErreurDownload
   
   'Initialise les variables
   Pourcent = 0
   Taille_Recue = 0
   Taille_Totale = 0
   Vitesse = 0
   LastTailleRecue = 0
   File = 0
   StrHeader = ""
   
   'Envoi l'evenement "ChangementStatus" avec pour argument le Status
   RaiseEvent ChangementStatus("Initialisation...")
   Lbl_Status = "Initialisation..."
   RaiseEvent Progress(0, 0, 1, 0)

   'Attends qu'il ai terminé ses operations
   While Inet.StillExecuting
      DoEvents
   Wend

   'Initialise le controle Internet Transfert
   Inet.URL = Source
   Inet.Execute , "GET"
   
   'Attends qu'il ai terminé ses operations
   While Inet.StillExecuting
      DoEvents
   Wend
   
   Lbl_Source = "Source : " & Source
   Lbl_Destination = "Destination : " & Destination
   RaiseEvent ChangementStatus("Recherche de la taille du fichier...")
   Lbl_Status = "Recherche de la taille du fichier..."
   
   'Utilise la fonction Taille pour récuperer la taille du fichier
   Taille_Totale = Taille(Source)
   Bar.Max = Taille_Totale
   Taille_Recue = 0
   Bar.Value = Taille_Recue
   
   RaiseEvent ChangementStatus("Ouverture du fichier de destination...")
   Lbl_Status = "Ouverture du fichier de destination..."
   
   'Cherche un no de fichier libre
   File = FreeFile()
   
   'Ouverture du fichier de destination
   Open Destination For Binary Access Write As #File
   
   'Si le fichier de destination existe deja :
   If FileLen(Destination) > 4096 Then
      If AutoResume = False Then Msg = MsgBox("Le fichier de destination existe déja, voulez-vous continuer le transfert ?", vbYesNoCancel, "Le fichier de destination existe déja")
                                  'Si AutoResume est sur False, on demande si il faut reprendre le téléchargement
      If Msg = vbNo Then          'Si non, on ferme le fichier de destination,
         Close #File              'On le supprime et on le créé
         Kill Destination
         Open Destination For Binary Access Write As #File
      End If
      
      If Msg = vbCancel Then      'Si "cancel",
         GoTo Fin                 'on arrete le téléchargement
      End If
                                  'Si AutoResume est sur True
                                  'ou si on a chosit de continuer
                                  'le téléchargement...
      If AutoResume = True Or Msg = vbYes Then
         RaiseEvent ChangementStatus("Reprise du téléchargement...")
         Taille_Recue = FileLen(Destination)
         Seek #File, Taille_Recue + 1
         Inet.Execute , "GET", , "Range: bytes=" & CStr(Taille_Recue) & "-" & vbCrLf
      End If
   End If
   
   'Attends qu'il ai terminé ses operations
   While Inet.StillExecuting
      DoEvents
   Wend
   
   'Debut du téléchargement
   RaiseEvent ChangementStatus("Téléchargement en cours...")
   Lbl_Status = "Téléchargement en cours..."
   Timer.Enabled = True              'Activation du Timer (pour la vitesse)
   Do
    DoEvents                         'Télécharge un bloc de données
    Data = Inet.GetChunk(Chunk_Size, icByteArray)
    Put #File, , Data                'Les enregistre dans le fichier
    Taille_Recue = Taille_Recue + UBound(Data, 1) + 1
    Bar.Value = Taille_Recue         'Met a jour la bar de progression
    Lbl_State = Taille_Recue & " / " & Taille_Totale & " - " & Pourcent & " %"
    Pourcent = Round(Taille_Recue / Taille_Totale * 100)
                        'Calcule la progression
    RaiseEvent Progress(Pourcent, Taille_Recue, Taille_Totale, Vitesse)

Loop While UBound(Data, 1) > 0
'Ferme le fichier
Close #File

Timer.Enabled = False
RaiseEvent ChangementStatus("Téléchargement terminé")
Lbl_Status = "Téléchargement terminé"
Exit Sub

'En cas d'erreur
ErreurDownload:
On Error Resume Next
If MsgBox("Erreur " & Err.Number & " - " & Err.Description & vbCrLf & "Effacer le fichier ?", vbYesNo, "Le téléchargement a échoué") = vbYes Then Kill Destination
Fin:
RaiseEvent ChangementStatus("Une erreur c'est produite !")
Lbl_Status = "Une erreur c'est produite !"
Close #File
End Sub

'Defini la vitesse
Private Sub Timer_Timer()
   Vitesse = (Taille_Recue - LastTailleRecue) * 2
   LastTailleRecue = Taille_Recue
End Sub

'Retrouve la taille d'un fichier sur internet
'Cette fonction peut être appelée sans necessiter
'un téléchargement, car elle utilise un control Inet
'différent
Public Function Taille(URL As String) As Long

Inet_Taille.URL = URL
Inet_Taille.Execute , "GET"

'Fait patienter le control Inet jusqu'a ce qu'il
'ait terminé ses taches
While Inet_Taille.StillExecuting
   DoEvents
Wend

'Cherche la taille
StrHeader = Inet_Taille.GetHeader("Content-Length")
Taille = Val(StrHeader)

End Function

'Arrete les operations des controls Inet en cours
Public Sub Cancel()
On Error Resume Next
Inet.Cancel
Inet_Taille.Cancel
RaiseEvent ChangementStatus("Téléchargement interrompu")
Lbl_Status = "Téléchargement interrompu"
Timer.Enabled = False
End Sub
  

Conclusion

V 1.1 :
   -- Support du resuming (ajout d'un arg a la fonction Download
   -- un bug corrigé

A venir :
  -- Une meilleur gestion de la vitesse
  -- Le temps
  -- Un controle d'erreur

Merci a Mad Vinz pour son aide sur le forum newscs.viendez.com (j'me debrouillais pas avec les OCX)  
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Nox le 04/03/2002 00:57:35

Une fois avoir résolu les 1000 et 1 erreurs de chargement de ton prog... c'est bien!
mais tas du travail pour arriver à la cheville de Getright :p

Avec un support de Resuming il serait tres puissant

Voila enfin une source qui manquait sur le site!
...je sais yen a une mais pas ak de progressbar ;)

signaler à un administrateur
Commentaire de max12 le 04/03/2002 02:01:35 administrateur CS

Oué c'est pas mal 10/10

signaler à un administrateur
Commentaire de DuncanIdaho le 04/03/2002 08:16:09

Je sais, je cherchais une source qui fasse sa, ms comme je l'ai pas trouvée, je l'ai faite :-)

je vais essayer de faire un support de resuming, et un control d'erreur...

;)

signaler à un administrateur
Commentaire de DuncanIdaho le 07/03/2002 17:50:59

voila, support du resuming ajouté... normalement sans bugs ;-)

signaler à un administrateur
Commentaire de diablotin le 11/07/2002 18:03:07

je l'aime bien mais il refait un fichier non original ton programme est bon mais il a des amélioration afaire mais le but est la pour sa je te donne 8/10

signaler à un administrateur
Commentaire de DuncanIdaho le 11/07/2002 21:53:25

? il telecharge pas bien ? :(

signaler à un administrateur
Commentaire de inconnuanonyme le 08/05/2003 20:46:57

lé bien :)

signaler à un administrateur
Commentaire de fpinchon le 18/05/2003 09:44:17

super ton ocx notamment pour la barre de progression et la taille du fichier.
une question : comment le transformer pour envoyer un fichier ? est-ce possible en substituant la commande Get par Put.
amities ;
cyclone

signaler à un administrateur
Commentaire de DuncanIdaho le 18/05/2003 19:33:44

lol ca fait un moment que j'y ai plus touché :S

mais si tu veux envoyer un fichier, y'a KFTP, une OCX de la katarn corporation qui marche bien (http://www.katarncorp.com/)

signaler à un administrateur
Commentaire de fpinchon le 18/05/2003 21:31:03

merci a toi, j'y vais !
sinon as-tu fait evoluer ton code depuis ?
amities ;
cyclone

signaler à un administrateur
Commentaire de DuncanIdaho le 19/05/2003 21:40:30

non. Mais je tacherais de m'y remetre un jour ;)

signaler à un administrateur
Commentaire de fpinchon le 20/05/2003 06:10:26

super l'OCX de la katarn !
merci pour le tuyau.
amities ;
cyclone

signaler à un administrateur
Commentaire de TopperFr le 13/10/2003 20:08:07

Moi j'ai un problème. Il marche très bien chez moi mais dès que je fais tester mon prog ailleurs on me reporte à chaque fois ce message d'erreur :

Impossible de cherger le contrôle "Download" à partir de OCX_Download.ocx Votre version de OCX_Download.ocx est peut-être obsolète, Vérifiez que vous utilisez la version du contrôle fournie avec votre application

D'où ça vient et comment le corriger ?

signaler à un administrateur
Commentaire de elgringoninio le 15/11/2003 11:20:32

Tout simplement génial !!!

signaler à un administrateur
Commentaire de phoennix le 14/01/2004 17:29:59

Salut !

Pour ceux qui ont un problème d'OCX obsolète, vérifiez les composants utilisés pour créer OCX_Download (Ctrl-T dans VB).

On peut donc voir que pour fonctionner, OCX_Download.ocx a besoin de MSINET.OCX et de MSCOMCTL.OCX.

@+

signaler à un administrateur
Commentaire de Ziman le 22/12/2004 13:29:03

trop dla balle !

signaler à un administrateur
Commentaire de MaxSoldier le 22/01/2005 07:58:10

Exactement ce qu'il me faut merci !

signaler à un administrateur
Commentaire de soldier8514 le 03/06/2005 09:52:47

très pratique ce code _ g remarqué toutefois kil manquait le controle de la taille du fichier retournée par la fonction Taille()  :

dans mon cas jai voulu télécharger un fichier pour lequel un mot de passe etait requis / du coup la fonction taille() renvoie 0 / et là  il ya aucun controle ... taille totale vaut alors 0 et l'ocx essaie de telecharger ... et plante ...

j'ai donc rajoutté les qqes lignes

   'Utilise la fonction Taille pour récuperer la taille du
   'fichier
   Taille_Totale = Taille(Source)
   's8514///////////////////////////////////////////////////
   'rajout ici
   If Taille_Totale = 0 Then
   File = FreeFile()
   Open Destination For Binary Access Write As #File
   Put #File, , "mi"
   Close #File
   Timer.Enabled = False
   Exit Sub
   End If
   'fin de rajout //////////////////////////////////////
   Bar.Max = Taille_Totale
   Taille_Recue = 0
   Bar.Value = Taille_Recue


Comm ça si on essaie de telecharger qqchose protégé par mot de passe (donc inaccessible ) ou bien un fichier inexistant  _ l'ocx crée kan meme un fichier de  moins de 1 ko _

A+

signaler à un administrateur
Commentaire de takali le 24/06/2005 18:21:03

Bonjour
je vais posé une question que vous allez trouvé tres bête mais :( ou faut t'il mettre l'adresse du url du fichier

A+ et Merci d'avance

signaler à un administrateur
Commentaire de Ziman le 25/06/2005 15:04:51

DownLoad1.Download "Source", "destination", AutoResume

C'est ainsi si ej m'en souviens bien
tu remplaces "Source" par l'url, destination apr lemplacement sur ton disque dur et AutoResume tu emt soit True si tu veux qu'il recréer le fichier ou False si tu veux le contraire (ou c'est le contraire, je ne sais plus, test et tu verras)

signaler à un administrateur
Commentaire de MiniKiller le 04/07/2005 19:11:52

Bonjour, je chercher à savoir comment je peux modifier la source de façon à ce qu'elle ne plante pas si l'ordinateur n'est pas connecté à Internet et/ou si le serveur est Out.
Merci à vous en tout cas, très bonne source !

signaler à un administrateur
Commentaire de soldier8514 le 04/07/2005 20:29:44

regardes ce que jai marqué plus haut petit scarabé _ c justement la soluce à ton soucis because si le fichier ne peut pas etre téléchargé alors Taille_Totale = 0  ;)

signaler à un administrateur
Commentaire de MiniKiller le 04/07/2005 22:33:00

Et bien en fait, si je demandais ça c'est parce que j'ai essayé ton code mais cela ne fonctionne pas, j'ai toujours une erreur 380. Pourtant le code est mis au bon endroit... je vais essayer de trouver la cause du problème. Merci

signaler à un administrateur
Commentaire de MiniKiller le 04/07/2005 23:03:33

Oups désolé pour ces posts inutiles, cela va bien je modifiais le mauvais fichier :-/ Ma médiocrité  me tuera :D
++

signaler à un administrateur
Commentaire de soundpanther le 09/12/2007 17:22:30 10/10

10/10 tres bien

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,856 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.