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

MacWarrior 33 Messages postés samedi 19 avril 2008Date d'inscription 5 septembre 2009 Dernière intervention - 11 août 2009 à 16:11 - Dernière réponse : MacWarrior 33 Messages postés samedi 19 avril 2008Date d'inscription 5 septembre 2009 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 11 août 2009 à 17:02
3
Merci
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

Merci Charles Racaud 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de Charles Racaud
Meilleure réponse
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 11 août 2009 à 19:57
3
Merci
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

Merci Charles Racaud 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de Charles Racaud
Meilleure réponse
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 11 août 2009 à 21:37
3
Merci
Oui,

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

_____________
Kenji

Merci Charles Racaud 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de Charles Racaud
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 11 août 2009 à 16:30
0
Merci
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
Commenter la réponse de Charles Racaud
MacWarrior 33 Messages postés samedi 19 avril 2008Date d'inscription 5 septembre 2009 Dernière intervention - 11 août 2009 à 16:45
0
Merci
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 :/
Commenter la réponse de MacWarrior
MacWarrior 33 Messages postés samedi 19 avril 2008Date d'inscription 5 septembre 2009 Dernière intervention - 11 août 2009 à 16:52
0
Merci
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() );
}
}
}
Commenter la réponse de MacWarrior
MacWarrior 33 Messages postés samedi 19 avril 2008Date d'inscription 5 septembre 2009 Dernière intervention - 11 août 2009 à 17:04
0
Merci
Merci de ton aide, je teste cela et je te donne des nouvelles
Commenter la réponse de MacWarrior
MacWarrior 33 Messages postés samedi 19 avril 2008Date d'inscription 5 septembre 2009 Dernière intervention - 11 août 2009 à 17:39
0
Merci
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.
Commenter la réponse de MacWarrior
MacWarrior 33 Messages postés samedi 19 avril 2008Date d'inscription 5 septembre 2009 Dernière intervention - 11 août 2009 à 17:48
0
Merci
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)
Commenter la réponse de MacWarrior
MacWarrior 33 Messages postés samedi 19 avril 2008Date d'inscription 5 septembre 2009 Dernière intervention - 11 août 2009 à 20:11
0
Merci
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.
Commenter la réponse de MacWarrior
MacWarrior 33 Messages postés samedi 19 avril 2008Date d'inscription 5 septembre 2009 Dernière intervention - 11 août 2009 à 21:52
0
Merci
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.
Commenter la réponse de MacWarrior

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.