2008-10-07 12 views
9

वेबरेस्पॉन्स से फ़ाइल प्राप्त करने का सबसे अच्छा तरीका क्या है (इस मामले में, एक पीडीएफ, लेकिन कोई भी फाइल करेगा) और उसे मेमोरीस्ट्रीम में डाल दें? WebResponse से .GetResponseStream() का उपयोग स्ट्रीम ऑब्जेक्ट प्राप्त करता है, लेकिन यदि आप उस स्ट्रीम को किसी विशिष्ट प्रकार की स्ट्रीम में कनवर्ट करना चाहते हैं, तो आप क्या करते हैं?मैं एक वेब रेस्पॉन्स को मेमोरी स्ट्रीम में कैसे रखूं?

उत्तर

0

इसे एक साल या उससे पहले वेब से कॉपी किया गया था।

//---------- 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

:

इसके बजाय मैं नीचे समाधान प्रस्तावित। –

-3

मैं 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

यह कुछ गंभीरता से मैला कोड है, मैं इसका कभी भी उपयोग नहीं करूंगा! – emalamisura

25

पर निम्न वहाँ SoloBold के answer है कि मैं जब यह परीक्षण की खोज के साथ एक गंभीर मुद्दा है पाया। FtpWebRequest के माध्यम से MemoryStream में फ़ाइल पढ़ने के लिए इसका उपयोग करते समय यह पूरी स्ट्रीम को स्मृति में पढ़ने में असफल रहा। मैंने इसे Peek() पर ट्रैक किया है, कभी-कभी पहले 1460 बाइट्स के बाद -1 लौटा रहा है, भले ही Read() सफल हो गया हो (फ़ाइल इससे काफी बड़ी थी)। यह कैसे के लिए कहा मूल पोस्टर के रूप में एक MemoryStream में एक WebResponse डाल करने के लिए प्रदर्शित नहीं करता है

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

यह मेरे लिए काम करता है, जबकि अन्य उत्तरों काम नहीं करते थे। – Matt

+1

उत्तर के लिए धन्यवाद, लॉरेंस। मैं कुछ अन्य तरीकों से ऐसा करने की कोशिश कर असंगत परिणाम प्राप्त कर रहा था। – Cashley

+1

जब आप .NET 4.0 में CopyTo (Stream, Int32) विधि द्वारा आईएल जेनरेट (dotPeek के माध्यम से) को देखते हैं तो आप देखेंगे कि यह कोड को एक ही पैटर्न के साथ उत्पन्न करता है लेकिन कोड की एक पंक्ति का उपयोग करता है। https://msdn.microsoft.com/en-us/library/system.io.stream.copyto(v=vs.100).aspx। प्रतिक्रिया। कॉपीराइट (मेमस्ट्रीम, 1024); memStream.Position = 0; –

संबंधित मुद्दे