web-dev-qa-db-fra.com

Comment utiliser HttpWebRequest / Response pour télécharger un fichier binaire (.exe) à partir d'un serveur Web?

J'écris un programme qui doit télécharger un .exe fichier à partir d'un site Web, puis enregistrez-le sur le disque dur. Le .exe est stocké sur mon site et son URL est la suivante (ce n'est pas le vrai uri que j'ai composé aux fins de cette question):

http://www.mysite.com/calc.exe

Après de nombreuses recherches sur le Web et des exemples, voici le code que j'ai trouvé jusqu'à présent:

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(http://www.mysite.com/calc.exe);
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();               
StreamReader streamReader = new StreamReader(responseStream);
string s = streamReader.ReadToEnd();

Comme vous pouvez le voir, j'utilise la classe StreamReader pour lire les données. Après avoir appelé ReadToEnd le lecteur de flux contient-il le contenu (binaire) de mon .exe? Puis-je simplement écrire le contenu du StreamReader dans un fichier (nommé calc.exe) et j'aurai téléchargé avec succès le .exe?

Je me demande pourquoi StreamReaderReadToEnd renvoie une chaîne. Dans mon cas, cette chaîne serait-elle le contenu binaire de calc.exe?

11
Jan Tacci

WebClient est la meilleure méthode pour télécharger un fichier. Mais vous pouvez utiliser la méthode suivante pour télécharger un fichier de manière asynchrone à partir du serveur Web.

private static void DownloadCurrent()
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("[url to download]");
    webRequest.Method = "GET";
    webRequest.Timeout = 3000;
    webRequest.BeginGetResponse(new AsyncCallback(PlayResponeAsync), webRequest);
}

private static void PlayResponeAsync(IAsyncResult asyncResult)
{
    long total = 0;
    long received = 0;
    HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState;

    try
    {                    
        using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult))
        {
            byte[] buffer = new byte[1024];

            FileStream fileStream = File.OpenWrite("[file name to write]");
            using (Stream input = webResponse.GetResponseStream())
            {        
                total = input.Length;

                int size = input.Read(buffer, 0, buffer.Length);
                while (size > 0)
                {
                    fileStream.Write(buffer, 0, size);
                    received += size;

                    size = input.Read(buffer, 0, buffer.Length);
                }
            }

            fileStream.Flush();
            fileStream.Close();
        }                 
    }
    catch (Exception ex)
    {
    }
}

Il y a un fil similaire ici - comment télécharger le fichier en utilisant httpwebrequest

12
Dipu

StreamReader est une implémentation de lecteur de texte, c'est-à-dire qu'il doit être utilisé pour lire des données texte et non des données binaires. Dans votre cas, vous devez utiliser directement le flux de réponse sous-jacent.

Pour télécharger un fichier, le moyen le plus simple serait d'utiliser la méthode WebClient.DownloadFile .

7
VinayC

Cela devrait directement enregistrer le fichier sur votre disque dur.

using System.Net;
using (WebClient webClient = new WebClient ())
{
    webClient.DownloadFile("http://www.mysite.com/calc.exe", "calc.exe");
}
3
user2492339

Je suis probablement un peu en retard, mais j'ai eu le même problème avec des fichiers toujours gros de 0 Ko s'ils ne fonctionnaient pas en mode débogage. Cela pourrait être une réponse relativement simple, mais la désactivation de "DEBUG-Constants" sous Propriétés l'a résolu pour moi.

1
ThexBasic

Au lieu d'utiliser StreamReader, vous devriez vraiment appeler la méthode Read() de votre objet Stream. Cela vous demandera de remplir un tampon d'octets [] avec des données lues, que vous pourrez ensuite écrire sur le disque en utilisant StreamWriter ou FileStream.

1
dotNET