2009-07-26 50 views
5

Tôi đang sử dụng mã sau để lấy tệp wmv thông qua WebResponse. Tôi đang sử dụng một thread để gọi chức năng này:Cách sử dụng WebResponse để Tải xuống tệp .wmv

static void GetPage(object data) 
{ 
    // Cast the object to a ThreadInfo 
    ThreadInfo ti = (ThreadInfo)data; 

    // Request the URL 
    WebResponse wr = WebRequest.Create(ti.url).GetResponse(); 

    // Display the value for the Content-Length header 
    Console.WriteLine(ti.url + ": " + wr.Headers["Content-Length"]); 
    string toBeSaved = @"C:\Users\Kevin\Downloads\TempFiles" + wr.ResponseUri.PathAndQuery;   
    StreamWriter streamWriter = new StreamWriter(toBeSaved); 

    MemoryStream m = new MemoryStream(); 
    Stream receiveStream = wr.GetResponseStream(); 
    using (StreamReader sr = new StreamReader(receiveStream)) 
    { 
     while (sr.Peek() >= 0) 
     { 
      m.WriteByte((byte)sr.Read()); 
     } 
     streamWriter.Write(sr.ReadToEnd()); 
     sr.Close(); 
     wr.Close(); 
    } 

    streamWriter.Flush(); 
    streamWriter.Close(); 

    // streamReader.Close(); 
    // Let the parent thread know the process is done 
    ti.are.Set(); 

    wr.Close(); 
} 

Các tập tin dường như tải tốt, nhưng Windows Media Viewer không thể mở các tập tin đúng. Một số lỗi ngớ ngẩn về việc không thể hỗ trợ loại tệp.

Điều gì vô cùng dễ dàng mà tôi bị thiếu?

+0

Bạn đã xác minh rằng Windows Media Viewer sẽ mở tệp thông thường bên ngoài ứng dụng của bạn? – thedz

+0

Có. Nên đã làm rõ điều đó. – KevDog

Trả lời

5

Bạn chỉ cần tải xuống dưới dạng nhị phân thay vì văn bản. Đây là một phương pháp mà nên làm các trick cho bạn.

public void DownloadFile(string url, string toLocalPath) 
{ 
    byte[] result = null; 
    byte[] buffer = new byte[4097]; 

    WebRequest wr = WebRequest.Create(url); 

    WebResponse response = wr.GetResponse(); 
    Stream responseStream = response.GetResponseStream; 
    MemoryStream memoryStream = new MemoryStream(); 

    int count = 0; 

    do { 
     count = responseStream.Read(buffer, 0, buffer.Length); 
     memoryStream.Write(buffer, 0, count); 

     if (count == 0) { 
      break; 
     } 
    } 
    while (true); 

    result = memoryStream.ToArray; 

    FileStream fs = new FileStream(toLocalPath, FileMode.OpenOrCreate, FileAccess.ReadWrite); 

    fs.Write(result, 0, result.Length); 

    fs.Close(); 
    memoryStream.Close(); 
    responseStream.Close(); 
} 
4

Tôi không hiểu tại sao bạn đang điền MemoryStream m một byte tại một thời điểm, nhưng sau đó viết sr vào tệp. Tại thời điểm đó, tôi tin rằng sr trống và MemoryStream m không bao giờ được sử dụng.

Dưới đây là một số mã tôi đã viết để thực hiện một tác vụ tương tự. Nó nhận được một WebResponse trong 32K khối cùng một lúc, và đưa nó trực tiếp vào một tập tin.

public void GetStream() 
{ 
    // ASSUME: String URL is set to a valid URL. 
    // ASSUME: String Storage is set to valid filename. 

    Stream response = WebRequest.Create(URL).GetResponse().GetResponseStream(); 
    using (FileStream fs = File.Create(Storage)) 
    { 
     Byte[] buffer = new Byte[32*1024]; 
     int read = response.Read(buffer,0,buffer.Length); 
     while (read > 0) 
     { 
      fs.Write(buffer,0,read); 
      read = response.Read(buffer,0,buffer.Length); 
     } 
    } 
    // NOTE: Various Flush and Close of streams and storage not shown here. 
} 
+0

Vâng, mã tiếp tục thay đổi và tôi đã thử nhiều thứ. Tôi nên làm một công việc tốt hơn để làm sạch nó trước khi gửi bài. Lỗi của tôi. – KevDog

2

Bạn đang sử dụng một StreamReaderStreamWriter chuyển luồng của mình, nhưng những lớp học để xử lý văn bản. Tệp của bạn là nhị phân và rất có thể là chuỗi CR, LF và CR LF có thể bị khóa khi bạn chuyển dữ liệu. Làm thế nào NUL ký tự được xử lý Tôi không có ý tưởng.

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