2010-05-29 51 views
17

Tôi đang cố gắng tải xuống và lưu tệp từ HttpWebResponse nhưng vẫn gặp sự cố khi lưu tệp (ngoài Tệp văn bản) đúng cách.C# lưu tệp từ Yêu cầu HTTP

Tôi nghĩ rằng một cái gì đó để làm với phần này:

byte[] byteArray = Encoding.UTF8.GetBytes(http.Response.Content); 
MemoryStream stream = new MemoryStream(byteArray); 

Text Files làm việc tốt với các mã trên nhưng khi tôi cố gắng để lưu các nội dung để một hình ảnh tập tin nó bị hỏng. Làm thế nào để tôi viết những dòng này 'string' dữ liệu vào một tập tin hình ảnh (và các tập tin nhị phân khác)

Quên đề cập đến, Đây là NET CP 3.5 và tôi có một lớp bao bọc xung quanh lớp HttpWebResponse để thêm OAuth, vv

+1

Vui lòng đăng mã của bạn thực sự ghi vào tệp. Có thể bạn đang viết nó ở chế độ văn bản. Bạn nên viết nó ở chế độ nhị phân. – Senthil

+0

@ Thứ tư: Không, đó là mã đọc có vấn đề - và điều đó đã được hiển thị. –

+0

Hmmm .. là vấn đề phần Encoding.UTF8.GetBytes()? – Senthil

Trả lời

44

Vấn đề là bạn đang diễn giải dữ liệu nhị phân dưới dạng văn bản, ngay cả khi nó không phải là - ngay sau khi bạn bắt đầu xử lý nội dung dưới dạng chuỗi thay vì byte, bạn đang gặp sự cố. Bạn chưa đưa ra chi tiết về lớp trình bao bọc của mình, nhưng tôi giả định thuộc tính Content của bạn đang trả về một chuỗi - bạn sẽ không thể sử dụng nó. Nếu lớp trình bao bọc của bạn không cho phép bạn lấy dữ liệu thô từ phản hồi trên web, bạn sẽ cần sửa đổi nó.

Nếu bạn đang sử dụng .NET 4, bạn có thể sử dụng phương thức CopyTo mới:

using (Stream output = File.OpenWrite("file.dat")) 
using (Stream input = http.Response.GetResponseStream()) 
{ 
    input.CopyTo(output); 
} 

Nếu bạn không sử dụng NET 4, bạn phải làm việc sao chép bằng tay:

using (Stream output = File.OpenWrite("file.dat")) 
using (Stream input = http.Response.GetResponseStream()) 
{ 
    byte[] buffer = new byte[8192]; 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
    } 
} 
+0

Yeh Tôi nghĩ đó là vấn đề. Đã thêm chi tiết (.NET Compact 3.5) – dkarzon

+0

@ d1k_is: Đoạn mã thứ hai sẽ hoạt động tốt trong khung công tác nhỏ gọn (ngoài việc thay đổi luồng đầu ra của bạn). –

+0

Đúng là vấn đề. Vì vậy, tôi đã phải sửa đổi trình bao bọc httpresponse để nó đọc luồng tới một tệp thay vì chỉ đến thuộc tính chuỗi nội dung. Cảm ơn! – dkarzon

7

Sử dụng WebClient.DownloadFile. Bạn có thể làm điều đó bằng tay (một cái gì đó like this), nhưng WebClient là đặt cược tốt nhất cho tải đơn giản.