CLASS DE TÉLÉCHARGEMENT HTTP AVEC GESTION DE RESUME, GESTION DE PROXY, INFO DE P

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 - 4 déc. 2004 à 19:16
blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 - 27 août 2010 à 20:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/27945-class-de-telechargement-http-avec-gestion-de-resume-gestion-de-proxy-info-de-progression-et-debit-moyen

blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 1
27 août 2010 à 20:43
Je veins de tester le programme sur Visual Studio 2010 (Express), la convertion fonctionne. Mais pour faire tourner la démonstration de la Classe, il faut effectuer quelques modifications dans l'utilisation du Thread, dont j'avoue ne pas connaitre en détail le fonctionnement du Threading. Il y a peu-être mieux que ce que je propose.

dans la partie déclarion de Form1, ajouter :
Delegate Sub SetDownStartCallback(ByVal totalfilele As Integer, ByVal resumepos As Integer, ByVal timestart As Integer)
Delegate Sub SetDownProgressCallback(ByVal actual_pos As Integer)
Delegate Sub SetDownEndCallback(ByVal actual_pos As Integer)

Dans la fonction download_start_dl, modifier "pgbar.Maximum =..." par :
If pgbar.InvokeRequired Then
Dim d As New SetDownStartCallback(AddressOf downloadz_start_dl)
Me.Invoke(d, New Object() {totalfilelen, resumepos, timestart})
Else
pgbar.Maximum = totalfilelen
End If

Dans la fonction downloadz_progress, modifier "pgbar.Value =..." par :
If pgbar.InvokeRequired Then
Dim d As New SetDownProgressCallback(AddressOf downloadz_progress)
Me.Invoke(d, New Object() {actual_pos})
Else
pgbar.Value = actual_pos
End If

Dans la fonction downloadz_end_dl, modifier "lblinfo.Text =..." par :
If pgbar.InvokeRequired Then
Dim d As New SetDownEndCallback(AddressOf downloadz_end_dl)
Me.Invoke(d, New Object() {actual_pos})
Else
lblinfo.Text = "Téléchargement effectué à " & curpercent & "% " & vbCrLf & vbCrLf & _
"Temps restant estimé : " & curremain & " secondes" & vbCrLf & vbCrLf & _
actual_pos & " sur " & lenfile & " octets téléchargés " & vbCrLf & vbCrLf & _
curko & " sur " & lenfileko & " kilo octets téléchargés " & vbCrLf & vbCrLf & _
tmpspeed & " Ko/sc"
End If

Suite à l'erreur de compilattion, mes modifications sont issues de la lecture des explications de l'aide Microsoft : http://msdn.microsoft.com/...
Smerek Messages postés 8 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 5 septembre 2008
2 janv. 2008 à 21:45
Bonjour et bravo pour cette source qui me paraît très intéressante !
J'utilise Visual Studio 2003, n'ayaht pas les moyens de racheter une licence de VS2005,c'est pour cela que je post ici et non pas sur le topic consacré à la version .Net2
Je compte me servir de cette source pour faire du téléchargement de gros fichiers (plusieurs Go), et j'aurais voulu savoir si cette classe permettait de gérer les pseudos microcoupures que l'on voit très souvent en utilisant un téléchargement "traditionnel" (sans utiliser de logiciel de téléchargement), comme par exemple en téléchargement un gros fichier, le téléchargement ne plante pas mais le fichier est corrompu.
Merci d'avance pour votre/vos réponse.
Bonne année !
François.
hvb Messages postés 939 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 janvier 2009 3
20 mars 2007 à 21:10
ouais.. on va pas arreter le hs ici, mp moi si tu veux des tutos sur les regex ou pour exposer ton problème plus concrètement
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
20 mars 2007 à 00:43
Mon souci d'expressions régulières c'est déjà pour détecter les urls de vidéos dans une page web. J'ai posté une question pour ça auquel je n'ai pas encore eu de réponses psotivies mais c'est aussi pour savoir manipuler les expressions régulière car j'ai beau chercher des tutos ou regarder le MSDN etc... lorsque j'essaye de faire une expressions régulières en fonction des explications ca marche jamais !
hvb Messages postés 939 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 janvier 2009 3
19 mars 2007 à 17:58
ah oui, nouvelle version, en .net2 ici :
http://www.vbfrance.com/code.aspx?ID=41850
hvb Messages postés 939 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 janvier 2009 3
19 mars 2007 à 17:55
c'est quoi ton soucis d'expressions régulières?
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
19 mars 2007 à 17:37
Moi je vais essayer ! A part ça toujours personne pour m'aider pour les expressions régulières !

Manu
hvb Messages postés 939 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 janvier 2009 3
13 mars 2007 à 17:29
lol un navigateur en vb...?
Je pense pas que ça serve à grand chose, il y a déja une excellente concurence... Firefox, Opéra et IE... nan? (oui j'ai oublié netscape volontairement ^^)
Puis si encore c'était dans un language portable, mais la c'est meme pas le cas...
Puis même si j'aime le fait de réinventer la roue dans un soucis d'apprentissage technique, la c'est un peu abusé quand même... mais si tu te lances dedans, je te souhaite bon courage!
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
13 mars 2007 à 16:56
derien HVB ;-)

Ca serait bien de travailler en équipe. Et dit moi ca te dit de faire un super naviguateur à 2 ?

Redman
hvb Messages postés 939 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 janvier 2009 3
13 mars 2007 à 12:44
OneHacker : j'avais plus miser sur le fonctionnement de la classe que des details du sample, mais tu as raison, merci de la remarque.
hvb Messages postés 939 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 janvier 2009 3
13 mars 2007 à 12:43
presque un an plus tard...
MoiDebutantVB : merci bcp de ta remarque totalement vraie... quelle connerie que de fixer le buffer à une aussi grande taille aussi...

Je suis en train de réecrire cette classe en .net2.0, car elle renvoit des évenement qui ne sont pas thread-safe, et m'est donc devenu inutile.
Je vais ajouter la nouvelle classe propre mais j'en profiterais pour regler cette petite stupidité du buffer sur la version actuelle.
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
5 nov. 2006 à 08:12
correction de form DL pour les 2 boutons ouvrir

Imports System.Net


Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Code généré par le Concepteur Windows Form "

Public Sub New()
MyBase.New()

'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()

'Ajoutez une initialisation quelconque après l'appel InitializeComponent()

End Sub

'La méthode substituée Dispose du formulaire pour nettoyer la liste des composants.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requis par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer

'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
'Elle peut être modifiée en utilisant le Concepteur Windows Form.
'Ne la modifiez pas en utilisant l'éditeur de code.
Friend WithEvents Button2 As System.Windows.Forms.Button
Friend WithEvents sfd As System.Windows.Forms.SaveFileDialog
Friend WithEvents Button3 As System.Windows.Forms.Button
Friend WithEvents Button4 As System.Windows.Forms.Button
Friend WithEvents Button5 As System.Windows.Forms.Button
Friend WithEvents ofd As System.Windows.Forms.OpenFileDialog
Friend WithEvents urltxt As System.Windows.Forms.Label
Friend WithEvents pgbar As System.Windows.Forms.ProgressBar
Friend WithEvents lblinfo As System.Windows.Forms.Label
Friend WithEvents CheckBox1 As System.Windows.Forms.CheckBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.pgbar = New System.Windows.Forms.ProgressBar
Me.lblinfo = New System.Windows.Forms.Label
Me.Button2 = New System.Windows.Forms.Button
Me.sfd = New System.Windows.Forms.SaveFileDialog
Me.Button3 = New System.Windows.Forms.Button
Me.Button4 = New System.Windows.Forms.Button
Me.Button5 = New System.Windows.Forms.Button
Me.ofd = New System.Windows.Forms.OpenFileDialog
Me.urltxt = New System.Windows.Forms.Label
Me.CheckBox1 = New System.Windows.Forms.CheckBox
Me.SuspendLayout()
'
'pgbar
'
Me.pgbar.Location = New System.Drawing.Point(8, 176)
Me.pgbar.Name = "pgbar"
Me.pgbar.Size = New System.Drawing.Size(408, 24)
Me.pgbar.TabIndex = 1
'
'lblinfo
'
Me.lblinfo.Location = New System.Drawing.Point(16, 48)
Me.lblinfo.Name = "lblinfo"
Me.lblinfo.Size = New System.Drawing.Size(400, 120)
Me.lblinfo.TabIndex = 2
'
'Button2
'
Me.Button2.Location = New System.Drawing.Point(320, 232)
Me.Button2.Name = "Button2"
Me.Button2.Size = New System.Drawing.Size(96, 24)
Me.Button2.TabIndex = 8
Me.Button2.Text = "Annuler"
'
'Button3
'
Me.Button3.Location = New System.Drawing.Point(8, 232)
Me.Button3.Name = "Button3"
Me.Button3.Size = New System.Drawing.Size(96, 24)
Me.Button3.TabIndex = 11
Me.Button3.Text = "Ouvrir"
'
'Button4
'
Me.Button4.Location = New System.Drawing.Point(112, 232)
Me.Button4.Name = "Button4"
Me.Button4.Size = New System.Drawing.Size(96, 24)
Me.Button4.TabIndex = 12
Me.Button4.Text = "Ouvrir le dossier"
'
'Button5
'
Me.Button5.Location = New System.Drawing.Point(216, 232)
Me.Button5.Name = "Button5"
Me.Button5.Size = New System.Drawing.Size(96, 24)
Me.Button5.TabIndex = 13
Me.Button5.Text = "Pause"
'
'urltxt
'
Me.urltxt.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.urltxt.Location = New System.Drawing.Point(16, 8)
Me.urltxt.Name = "urltxt"
Me.urltxt.Size = New System.Drawing.Size(392, 40)
Me.urltxt.TabIndex = 14
'
'CheckBox1
'
Me.CheckBox1.Location = New System.Drawing.Point(16, 208)
Me.CheckBox1.Name = "CheckBox1"
Me.CheckBox1.Size = New System.Drawing.Size(336, 16)
Me.CheckBox1.TabIndex = 15
Me.CheckBox1.Text = "Fermer la fenetre à la fin du téléchargement"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(424, 261)
Me.Controls.Add(Me.CheckBox1)
Me.Controls.Add(Me.urltxt)
Me.Controls.Add(Me.Button5)
Me.Controls.Add(Me.Button4)
Me.Controls.Add(Me.Button3)
Me.Controls.Add(Me.Button2)
Me.Controls.Add(Me.lblinfo)
Me.Controls.Add(Me.pgbar)
Me.Name = "Form1"
Me.Text = "Téléchargement"
Me.ResumeLayout(False)

End Sub

#End Region



Public WithEvents downloadz As New HBDownloader
Dim tmpspeed As Integer
Dim curremain As Integer
Dim oldsec As Integer
Dim cursec As Integer
Dim curko As Integer
Dim curpercent As Integer
Dim lenfileko As Integer
Dim starttime As Integer
Dim lenfile As Integer
Dim posresume As Integer
Dim filename As String
Dim pathstr As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
urltxt.Text = "Source : " & urlstr
If isresume = False Then
sfd.Filter = urlstr.Substring(urlstr.LastIndexOf(".") + 1) & "files|*." & urlstr.Substring(urlstr.LastIndexOf(".") + 1)
sfd.ShowDialog()
If sfd.FileName <> "" Then
pathstr = sfd.FileName
filename = pathstr.Substring(pathstr.LastIndexOf("") + 1)
If IO.File.Exists(pathstr) = True Then IO.File.Delete(pathstr)
downloadz.start(pathstr, urlstr, isresume)
Else
End
End If
Else
ofd.Filter = urlstr.Substring(urlstr.LastIndexOf(".") + 1) & "files|*." & urlstr.Substring(urlstr.LastIndexOf(".") + 1)
ofd.ShowDialog()
If ofd.FileName <> "" Then
pathstr = ofd.FileName
filename = pathstr.Substring(pathstr.LastIndexOf("") + 1)
downloadz.start(pathstr, urlstr, isresume)
Else
End
End If
End If
Button3.Enabled = False
Button4.Enabled = False
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Diagnostics.Process.Start(pathstr)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
downloadz.stop_dl()
End
End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
If Button5.Text = "Pause" Then
downloadz.stop_dl()
Button5.Text = "Reprise"
Button4.Enabled = True
Else
Button4.Enabled = False
isresume = True
Button5.Text = "Pause"
downloadz.start(pathstr, urlstr, isresume)
End If
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Diagnostics.Process.Start(New IO.FileInfo(pathstr).Directory.FullName)
End Sub

Private Sub downloadz_start_dl(ByVal totalfilelen As Integer, ByVal resumepos As Integer, ByVal timestart As Integer) Handles downloadz.start_dl
pgbar.Maximum = totalfilelen
starttime = timestart
lenfile = totalfilelen
posresume = resumepos
lenfileko = totalfilelen / 1024
oldsec = 0
cursec = 0
End Sub
Private Sub downloadz_progress(ByVal actual_pos As Integer) Handles downloadz.progress
pgbar.Value = actual_pos
curpercent = (actual_pos / lenfile * 100)
curko = actual_pos / 1024
Application.DoEvents()
cursec = ((Environment.TickCount - starttime) / 1000)
If oldsec < cursec Then
lblinfo.Text = "Téléchargement effectué à " & curpercent & "% " & vbCrLf & vbCrLf & _
"Temps restant estimé : " & curremain & " secondes" & vbCrLf & vbCrLf & _
actual_pos & " sur " & lenfile & " octets téléchargés " & vbCrLf & vbCrLf & _
curko & " sur " & lenfileko & " kilo octets téléchargés " & vbCrLf & vbCrLf & _
tmpspeed & " Ko/sc"
Me.Text = curpercent & "% de " & filename & " téléchargés"
oldsec = cursec
tmpspeed = ((actual_pos - posresume) / 1024) / cursec
curremain = (lenfileko - (actual_pos / 1024)) / tmpspeed
End If
End Sub

Private Sub downloadz_end_dl(ByVal actual_pos As Integer) Handles downloadz.end_dl

pgbar.Value = actual_pos
curpercent = (actual_pos / lenfile * 100)
curko = actual_pos / 1024
Application.DoEvents()
cursec = ((Environment.TickCount - starttime) / 1000)
Me.Text = curpercent & "% de " & filename & " téléchargés"
oldsec = cursec
tmpspeed = ((actual_pos - posresume) / 1024) / cursec
curremain = (lenfileko - (actual_pos / 1024)) / tmpspeed
lblinfo.Text = "Téléchargement effectué à " & curpercent & "% " & vbCrLf & vbCrLf & _
"Temps restant estimé : " & curremain & " secondes" & vbCrLf & vbCrLf & _
actual_pos & " sur " & lenfile & " octets téléchargés " & vbCrLf & vbCrLf & _
curko & " sur " & lenfileko & " kilo octets téléchargés " & vbCrLf & vbCrLf & _
tmpspeed & " Ko/sc"
Button2.Text = "Fermer"
If actual_pos = lenfile Then
MsgBox("Téléchargement terminés")
Button3.Enabled = True
Button4.Enabled = True

End If
End Sub
End Class
hvb Messages postés 939 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 janvier 2009 3
23 janv. 2006 à 09:22
effectivement, la gestion d'erreur laisse à desirer... il faudrait que je prenne le temps d'ammeliorer ça, et aussi un problème de debit sur les connexion très haut debit...mais en ce moment ce n'est pas facile au niveau du temps.
Merci pour les commentaires en tout cas.
cs_troll01 Messages postés 2 Date d'inscription samedi 6 décembre 2003 Statut Membre Dernière intervention 20 janvier 2006
20 janv. 2006 à 16:12
Bon apres un autre test il semblerai que cela fonctionne bien en fait désolé !!

Manque juste une gestion des exception notement en cas d'absence du fichier distant...


En tout cas merci pour cette solution !
cs_troll01 Messages postés 2 Date d'inscription samedi 6 décembre 2003 Statut Membre Dernière intervention 20 janvier 2006
20 janv. 2006 à 16:06
Sympa ce bout de code mais visiblement il change les fichiers... j'ai essayer de télécharger un fichier zip, le fichier est bien present sur le disque local mais le zip est corrompu...

Une idée?
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
4 déc. 2004 à 19:16
Joli Boulot !!!

8/10
Rejoignez-nous