ProgressBar et téléchargement d'un fichier [Résolu]

Signaler
-
 Utilisateur anonyme -
Salutations,
Me replongeant dans le développement d'un programme que j'avais laissé de côté, je tombe sur un petit problème :
Je souhaite utiliser une progressbar pour afficher le téléchargement d'un fichier au lieu de passer par l'ouverture du lien dans le navigateur pour télécharger le fichier.

Pour télécharger un fichier, j'utilise cette commande :
My.Computer.Network.DownloadFile("LIEN_VERS_MON_FICHIER", Application.StartupPath & "\DOSSIER_DE_DESTINATION")

Cette commande, très pratique avec les petits fichiers devient inutilisable avec des fichiers plus gros puisque pendant le téléchargement, on ne peut rien faire, et on ne sais pas où en est le téléchargement.

( Quand je parle de petits fichiers, je veux dire des fichiers de moins de 10Ko et par gros fichiers, j'entends des fichier de plus de 1 Mo )

Cette commande a donc fait ses preuves au sein de mon programme, mais je souhaiterai l'associer à une progressbar affin d'afficher l'avancement du téléchargement.

Je n'ai pas trouvé mon bonheur dans les différentes recherches que j'ai mené, je n'ai pas réussi à utiliser les codes fournis...
Je m'en remet donc à vous pour ce bout de code

Merci d'avance pour votre aide !
Cordialement,
MacWarrior.

11 réponses

Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Voici la tradiction :
ProgressBar1.Visible = True
ProgressBar1.Minimum = 1
ProgressBar1.Value = 1
ProgressBar1.Step = 1024

Dim MemoryStreamImage As New IO.MemoryStream()
Dim myWebRequest As Net.WebRequest = Net.WebRequest.Create(TextBox1.Text)
Dim myWebResponse As Net.WebResponse = myWebRequest.GetResponse()
ProgressBar1.Maximum = Convert.ToInt32(myWebResponse.ContentLength)
Dim StreamImage As IO.Stream = myWebResponse.GetResponseStream()
Dim b(1024) As Byte
Dim bytesRead As Integer = StreamImage.Read(b, 0, b.Length)
Do While bytesRead > 0
  MemoryStreamImage.Write(b, 0, bytesRead)
  ProgressBar1.PerformStep()
  bytesRead = StreamImage.Read(b, 0, b.Length)
Loop
StreamImage.Close()
PictureBox1.Image = New Bitmap(MemoryStreamImage)
MemoryStreamImage.Close()
myWebResponse.Close()



_____________
Kenji
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Oui, c'est possible,

Il faut juste changer le type du stream :

Dim MemoryStreamImage As New IO.FileStream(Application.StartupPath & "DESTINATION_DU_FICHIER", IO.FileMode.Create)
Dim myWebRequest As Net.WebRequest = Net.WebRequest.Create(TextBox1.Text)
Dim myWebResponse As Net.WebResponse = myWebRequest.GetResponse()
ProgressBar1.Maximum = Convert.ToInt32(myWebResponse.ContentLength)
Dim StreamImage As IO.Stream = myWebResponse.GetResponseStream()
Dim b(1024) As Byte
Dim bytesRead As Integer = StreamImage.Read(b, 0, b.Length)
Do While bytesRead > 0
  MemoryStreamImage.Write(b, 0, bytesRead)
  ProgressBar1.PerformStep()
  bytesRead = StreamImage.Read(b, 0, b.Length)
Loop
StreamImage.Close()
MemoryStreamImage.Close()
myWebResponse.Close()



_____________
Kenji
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Oui,

Ajoute un Application.DoEvents() dans la boucle.
Sinon, (le mieux mais peut-être plus compliqué), faire ca dans un autre Thread.

_____________
Kenji
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Salut,

Regarde cette source : http://www.csharpfr.com/codes/PROGRESSBAR-SUR-TELECHARGEMENT-FICHIER_22744.aspx
Elle est en c# mais adaptable en vb.net.

_____________
Kenji

Merci de m'avoir répondu aussi vite.

Dans mes recherches, je suis déjà arrivé sur cette page, et j'ai testé le programme disponible, mais je n'ai pas les compétences pour adapter le code source en vb.net, certaines parties sont compatibles, tel que :

ProgressBar1.Visible = true
ProgressBar1.Minimum = 1
ProgressBar1.Value = 1
ProgressBar1.Step = 1024

Mais le reste du code reste pour moi incompréhensible :/

Milles excuses pour ce double post...

Après re-lecture du code source de ton lien, il n'y a qu'une partie du code que je ne comprend pas :


			MemoryStream MemoryStreamImage = new MemoryStream();

WebRequest myWebRequest = WebRequest.Create(TextBox1.Text);
WebResponse myWebResponse = myWebRequest.GetResponse(); 
ProgressBar1.Maximum = Convert.ToInt32(myWebResponse.ContentLength);
Stream StreamImage = myWebResponse.GetResponseStream();

byte[] b = new byte[1024];
int bytesRead = 0;
      while ((bytesRead = StreamImage.Read(b, 0, b.Length)) > 0)
      {
//		      MemoryStreamImage.Write(b, 0, b.Length);
      MemoryStreamImage.Write(b, 0, bytesRead);
      ProgressBar1.PerformStep();
}
StreamImage.Close();
PictureBox1.Image = new Bitmap(MemoryStreamImage);
MemoryStreamImage.Close();
myWebResponse.Close(); 
}

public static void Main()
{
Application.Run(new Progressbar() );
}
}
}

Merci de ton aide, je teste cela et je te donne des nouvelles

Le code a l'air de fonctionner, cependant, j'aurai certaines questions :

Où le fichier téléchargé est-il enregistré ?
Comment modifier cet endroit ?

Une fois le fichier téléchargé, j'obtiens une erreur :
System.ArgumentException: Le paramètre n'est pas valide.
à System.Drawing.Bitmap..ctor(Stream stream)
à world_of_boss_reborn.Installations.PictureBox2_Click(Object sender, EventArgs e) dans C:\Documents and Settings\MacWarrior\Bureau\World Of Boss V.4\World Of Boss V.3\Installations.vb:ligne 35
à System.Windows.Forms.Control.OnClick(EventArgs e)
à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
à System.Windows.Forms.Control.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


Encore merci pour ton aide.

Je vient de comprendre où se situe mon problème ^^
En fait, le fichier que je fait télécharger est un exécutable (.exe), la fonction :

PictureBox1.Image = New Bitmap(MemoryStreamImage)


Ne pouvais donc pas fonctionner, d'où mon erreur.

Est-ce possible d'utiliser cette commande pour copier le fichier téléchargé à l'endroit voulu :
My.Computer.FileSystem.WriteAllBytes(Application.StartupPath & "DESTINATION_DU_FICHIER", SOURCE_DU_FICHIER (je ne sais pas quoi mettre ici ), False)

Merci !
Après un petit test, ton code fonctionne parfaitement :D

Une petite question tout de même, pendant le téléchargement, la fenêtre est gelé, est-ce corrigible ?
Si oui, comment ?

Encore merci !
Cordialement,
MacWarrior.

Encore merci pour ton aide précieuse !
J'ai utilisé la fonction
Application.DoEvents()
qui fonctionne parfaitement malgré les 2 petites secondes de freeze de l'application lors du lancement de la fonction précédente.

Je ne suis évidement pas assez calé pour la seconde solution, à vraie dire, je ne sais même pas à quoi cela correspond :p

En tout cas, merci énormément pour ton aide qui me permet de développer mon application ;)
Cordialement,
MacWarrior.