如何使用HttpWebRequest/Response从Web服务器下载二进制(.exe)文件?

Jan*_*cci 10 c# stream httpwebrequest httpwebresponse streamreader

我正在编写一个程序,需要.exe从网站下载文件,然后将其保存到硬盘驱动器.将.exe存储在我的网站,它的网址如下(这不是真正的URI只是一个我提出了对这个问题的目的):

http://www.mysite.com/calc.exe
Run Code Online (Sandbox Code Playgroud)

经过许多网络搜索和摸索示例之后,到目前为止,我已经提出了代码:

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();
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在使用StreamReader该类来读取数据.调用之后ReadToEnd,流阅读器是否包含我的.exe的(二进制)内容?我可以只将文件的内容写入StreamReader文件(名为calc.exe),我会成功下载.exe吗?

我想知道为什么StreamReader ReadToEnd返回一个字符串.在我的情况下,这个字符串是否是calc.exe的二进制内容?

Dip*_*ipu 12

WebClient是下载文件的最佳方法.但您可以使用以下方法从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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

这里有一个类似的线程 - 如何使用HttpWebRequest和HttpWebResponse类(Cookies,凭证等)下载文件

  • 谢谢你的回答.行总数= input.Length中存在微不足道的错误; 因为long类型总变量中的input.Length也必须是long类型. (3认同)

Vin*_*ayC 7

StreamReader是一个文本阅读器实现,即它应该用于读取文本数据而不是二进制数据.在您的情况下,您应该直接使用底层响应流.

对于下载文件,最简单的方法是使用WebClient.DownloadFile方法.