2013-01-07 37 views
5

Tôi đang viết một chương trình cần tải xuống tệp .exe từ một trang web và sau đó lưu tệp đó vào ổ cứng. Các .exe được lưu trữ trên trang web của tôi và đó là url là như sau (nó không phải là uri thực chỉ là một tôi đã bù đắp lại mục đích của câu hỏi này):Cách sử dụng HttpWebRequest/Response để tải xuống tệp nhị phân (.exe) từ máy chủ web?

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

Sau nhiều tìm kiếm web và dò dẫm qua ví dụ ở đây là mã Tôi đã đưa ra cho đến nay:

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(); 

Như bạn có thể thấy tôi đang sử dụng lớp StreamReader để đọc dữ liệu. Sau khi gọi ReadToEnd trình đọc luồng có chứa nội dung (nhị phân) của tệp .exe của tôi không? Tôi có thể viết nội dung của StreamReader vào một tệp (có tên calc.exe) và tôi sẽ tải xuống thành công tệp .exe không?

Tôi tự hỏi tại sao StreamReaderReadToEnd trả về một chuỗi. Trong trường hợp của tôi chuỗi này sẽ là nội dung nhị phân của calc.exe?

Trả lời

6

StreamReader là triển khai trình đọc văn bản tức là nó nên được sử dụng để đọc dữ liệu văn bản chứ không phải dữ liệu nhị phân. Trong trường hợp của bạn, bạn nên trực tiếp sử dụng luồng phản hồi cơ bản.

Để tải xuống tệp, cách đơn giản nhất là sử dụng phương thức WebClient.DownloadFile.

+0

Xin cảm ơn! Sẽ kiểm tra WebClient.DownloadFile ngay bây giờ! –

+0

WebClient DownloadFile đã hoạt động và chỉ có 3 dòng mã! –

1

Thay vì sử dụng StreamReader, bạn thực sự cần gọi phương thức Read() đối tượng Stream của mình. Điều đó sẽ yêu cầu bạn cho một byte [] đệm được điền vào với dữ liệu đọc, sau đó bạn có thể ghi vào đĩa bằng cách sử dụng StreamWriter hoặc FileStream.

+0

Tôi thấy một ví dụ về ai đó đang đọc luồng bằng cách sử dụng mảng byte và vòng lặp cho đến khi không có thêm dữ liệu. Tôi thực sự đã thử nó ra là tốt. Đây là vòng lặp mà tôi đã sử dụng: * while ((bytesRead = responseStream.Read (buffer, 0, buffer.Length))> 0) *. Đó có phải là cách bạn đang đề nghị tôi làm điều đó không? –

2

Điều này sẽ trực tiếp lưu tệp trên đĩa cứng của bạn.

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

Anh ấy yêu cầu httpwebrequests không phải webclient –

7

WebClient là phương pháp tốt nhất để tải xuống tệp. Nhưng bạn có thể sử dụng phương pháp sau để tải xuống một tệp không đồng bộ từ máy chủ 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) 
{ 
    int total = 0; 
    int 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) 
    { 
    } 
} 

Có một chủ đề tương tự ở đây - How to Download the File using HttpWebRequest and HttpWebResponse class(Cookies,Credentials,etc.)

0

Tôi có thể là một chút muộn nhưng tôi có cùng một vấn đề với các tập tin là luôn 0KB lớn nếu không chạy trong chế độ Debug .. sức này là một câu trả lời tương đối đơn giản nhưng vô hiệu hóa "DEBUG-Constants" trong Properties đã giải quyết nó cho tôi.

Các vấn đề liên quan