2008-10-07 14 views
9

Cách tốt nhất để lấy tệp (trong trường hợp này là .PDF, nhưng bất kỳ tệp nào sẽ làm) từ một WebResponse và đặt nó vào một MemoryStream? Sử dụng .GetResponseStream() từ WebResponse nhận đối tượng Luồng, nhưng nếu bạn muốn chuyển đổi Luồng đó thành một loại luồng cụ thể, bạn sẽ làm gì?Làm cách nào để đặt một WebResponse vào luồng bộ nhớ?

Trả lời

0

Sao chép trang này từ web một năm trước.

//---------- Start HttpResponse 
if(objHttpWebResponse.StatusCode == HttpStatusCode.OK) 
    { 
     //Get response stream 
     objResponseStream = objHttpWebResponse.GetResponseStream(); 

     //Load response stream into XMLReader 
     objXMLReader = new XmlTextReader(objResponseStream); 

     //Declare XMLDocument 
     XmlDocument xmldoc = new XmlDocument(); 
     xmldoc.Load(objXMLReader); 

     //Set XMLResponse object returned from XMLReader 
     XMLResponse = xmldoc; 

     //Close XMLReader 
     objXMLReader.Close(); 
    } 

    //Close HttpWebResponse 
    objHttpWebResponse.Close(); 
} 
+0

này không hiển thị như thế nào để đặt một WebResponse vào một MemoryStream như các poster ban đầu yêu cầu. –

-3

Tôi tìm thấy sau tại http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/eeeefd81-8800-41b2-be63-71acdaddce0e/

Dim request As WebRequest 
    Dim response As WebResponse = Nothing 
    Dim s As Stream = Nothing 
    Dim fs As FileStream = Nothing 
    Dim file As MemoryStream = Nothing 

    Dim uri As New Uri(String.Format("http://forums.microsoft.com/forums/ShowPost.aspx?PostID=2992978&SiteID=1")) 
    request = WebRequest.Create(uri) 
    request.Timeout = 10000 
    response = request.GetResponse 
    s = response.GetResponseStream 

    '2 - Receive file as memorystream 
    Dim read(256) As Byte 
    Dim count As Int32 = s.Read(read, 0, read.Length) 
    File = New MemoryStream 
    Do While (count > 0) 
     File.Write(read, 0, count) 
     count = s.Read(read, 0, read.Length) 
    Loop 
    File.Position = 0 
    'Close responsestream 
    s.Close() 
    response.Close() 

    '3 - Save file 
    fs = New FileStream("c:\test.html", FileMode.CreateNew) 
    count = file.Read(read, 0, read.Length) 
    Do While (count > 0) 
     fs.Write(read, 0, count) 
     count = file.Read(read, 0, read.Length) 
    Loop 
    fs.Close() 
    File.Close() 
+2

Đây là một số mã sloppy nghiêm trọng, tôi sẽ không bao giờ sử dụng nó! – emalamisura

25

Có một vấn đề nghiêm trọng với SoloBold của answer mà tôi khám phá ra trong khi thử nghiệm nó. Khi sử dụng nó để đọc một tập tin thông qua một FtpWebRequest vào một MemoryStream nó liên tục không đọc toàn bộ dòng vào bộ nhớ. Tôi theo dõi điều này xuống đến Peek() đôi khi trở về -1 sau 1460 byte đầu tiên mặc dù Read() sẽ thành công (tệp lớn hơn đáng kể so với điều này).

Thay vào đó tôi đề xuất các giải pháp dưới đây:

MemoryStream memStream; 
using (Stream response = request.GetResponseStream()) { 
    memStream = new MemoryStream(); 

    byte[] buffer = new byte[1024]; 
    int byteCount; 
    do { 
     byteCount = stream.Read(buffer, 0, buffer.Length); 
     memStream.Write(buffer, 0, byteCount); 
    } while (byteCount > 0); 
} 

// If you're going to be reading from the stream afterwords you're going to want to seek back to the beginning. 
memStream.Seek(0, SeekOrigin.Begin); 

// Use memStream as required 
+0

Điều này phù hợp với tôi, trong khi các câu trả lời khác không hiệu quả. – Matt

+1

Cảm ơn câu trả lời, Lawrence. Tôi đã nhận được kết quả không nhất quán cố gắng để làm điều này một vài cách khác. – Cashley

+1

Khi bạn nhìn vào IL được tạo ra (thông qua dotPeek) bằng phương thức CopyTo (Stream, Int32) trong .net 4.0, bạn sẽ thấy rằng nó tạo ra mã có cùng mẫu nhưng sử dụng một dòng mã. https://msdn.microsoft.com/en-us/library/system.io.stream.copyto(v=vs.100).aspx. response.CopytTo (memStream, 1024); memStream.Position = 0; –

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