2011-01-22 62 views
13

tôi sử dụng HTTP GET rằng download một file zip trong một trình duyệt, một cái gì đó giống như https://example.com/up/DBID/a/rRID/eFID/vVID (không phải là url chính xác)Làm cách nào để tải xuống tệp zip trong C#?

Bây giờ, khi tôi cố gắng làm việc tải xuống cùng trong mã C# (tương tự phương thức GET như trên) cho một ứng dụng máy tính để bàn, tệp zip được tải xuống không phải là tệp lưu trữ hợp lệ. Khi tôi mở tập tin này trong notepad, đó là một số trang HTML.

Tôi nghĩ rằng tôi không đặt chính xác một số tiêu đề. Tôi nhìn xung quanh để lấy ví dụ. Tôi đã tìm thấy một số tải lên wrt, nhưng không thấy bất cứ điều gì để tải xuống.

Code:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "GET"; 
request.ContentType = "application/zip"; 
try 
{ 
    HttpWebResponse res = (HttpWebResponse)request.GetResponse(); 
    using (StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.Default)) 
    { 
     StreamWriter oWriter = new StreamWriter(@"D:\Downloads\1.zip"); 
     oWriter.Write(sr.ReadToEnd()); 
     oWriter.Close(); 
    } 
    res.Close(); 
} 
catch (Exception ex) 
{ 
} 
+4

Đây là một unguessable 'nó không hoạt động' câu hỏi. Đăng mã, ghi lại những gì bạn thấy khi bạn mở tệp trong trình xem hex. –

Trả lời

37

Đó chủ yếu là vì bạn sử dụng một StreamWriter : TextWriter để xử lý một file Zip nhị phân. StreamWriter dự kiến ​​văn bản và sẽ áp dụng Mã hóa. Và ngay cả Bộ mã hóa ASCII đơn giản cũng có thể cố gắng 'sửa' những gì nó cho là kết thúc dòng không hợp lệ.

Bạn có thể thay thế tất cả các mã của bạn với:

using (var client = new WebClient()) 
    { 
    client.DownloadFile("http://something", @"D:\Downloads\1.zip"); 
    } 
+0

Ồ vâng, tôi có thể thấy cùng một vấn đề trong đó. –

+0

+1 đánh bại tôi - @Al: Tôi đã thử nghiệm tệp này bằng một tệp zip và nó hoạt động tốt, bạn có chắc tệp đó không bị hỏng không? – BrokenGlass

+0

WebClient cũng đã tạo cùng một loại tệp zip. – Merrin

7

Bạn chỉ có thể sử dụng WebClient cho một 2-liner:

using(WebClient wc = new WebClient()) 
{ 
    wc.DownloadFile(url, @"D:\Downloads\1.zip"); 
} 
+0

Ngắn và đơn giản. Tôi thích loại lập trình đó. +1 cho bạn –

+1

@anvarbekraupov: Tôi đang sử dụng câu lệnh 'using' - nhìn khó hơn – BrokenGlass

+0

@BrokenGlass, thay thế hạ cấp của tôi bằng +1, xin lỗi! –

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