ProgressBar et téléchargement d'un fichier

Résolu
Utilisateur anonyme - 11 août 2009 à 16:11
 Utilisateur anonyme - 11 août 2009 à 21:52
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

Utilisateur anonyme
11 août 2009 à 17:02
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
3
Utilisateur anonyme
11 août 2009 à 19:57
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
3
Utilisateur anonyme
11 août 2009 à 21:37
Oui,

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

_____________
Kenji
3
Utilisateur anonyme
11 août 2009 à 16: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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
11 août 2009 à 16:45
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 :/
0
Utilisateur anonyme
11 août 2009 à 16:52
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() );
}
}
}
0
Utilisateur anonyme
11 août 2009 à 17:04
Merci de ton aide, je teste cela et je te donne des nouvelles
0
Utilisateur anonyme
11 août 2009 à 17:39
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.
0
Utilisateur anonyme
11 août 2009 à 17:48
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)
0
Utilisateur anonyme
11 août 2009 à 20:11
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.
0
Utilisateur anonyme
11 août 2009 à 21:52
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.
0
Rejoignez-nous