2011-10-12 69 views
1

我正在實現一個接受圖像流的wcf服務。但是,當我運行它時,我正在得到一個異常。因爲它試圖在流完成之前獲取流的長度。所以我想要做的是緩衝流直到它完成。但我找不到任何如何做到這一點的例子...如何緩衝輸入流,直到它完成

任何人都可以幫忙嗎?

到目前爲止我的代碼:

public String uploadUserImage(Stream stream) 
    { 
      Stream fs = stream; 

      BinaryReader br = new BinaryReader(fs); 

      Byte[] bytes = br.ReadBytes((Int32)fs.Length);// this causes exception 

      File.WriteAllBytes(filepath, bytes); 
    } 
+2

什麼是異常的類型和消息? –

回答

5

,而不是試圖取長,你應該從流中讀取,直到它返回它的「完成」。在.NET 4中,這是很容易:

// Assuming we *really* want to read it into memory first... 
MemoryStream memoryStream = new MemoryStream(); 
stream.CopyTo(memoryStream); 
memoryStream.Position = 0; 
File.WriteAllBytes(filepath, memoryStream); 

在.NET 3.5沒有CopyTo方法,但你可以寫類似的東西自己:

public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[8192]; 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
    } 
} 

不過,現在我們已經得到的東西來複制一個流,爲什麼麻煩先把它全部讀入內存?我們只是把它寫直到一個文件:

using (FileStream output = File.OpenWrite(filepath)) 
{ 
    CopyStream(stream, output); // Or stream.CopyTo(output); 
} 
+0

不斷得到一個:在System.IO .__ Error.WinIOError(Int32 errorCode,字符串maybeFullPath)異常... – user808359

1

我不知道你正在返回什麼(或不返回),但這樣的事情可能會爲你工作:

public String uploadUserImage(Stream stream) { 
    const int KB = 1024; 
    Byte[] bytes = new Byte[KB]; 
    StringBuilder sb = new StringBuilder(); 
    using (BinaryReader br = new BinaryReader(stream)) { 
    int len; 
    do { 
     len = br.Read(bytes, 0, KB); 
     string readData = Encoding.UTF8.GetString(bytes); 
     sb.Append(readData); 
    } while (len == KB); 
    } 
    //File.WriteAllBytes(filepath, bytes); 
    return sb.ToString(); 
} 

字符串可以我相信最高可達2 GB。

0

試試這個:

using (StreamWriter sw = File.CreateText(filepath)) 
    { 
     stream.CopyTo(sw); 
     sw.Close(); 
    } 
+0

爲此工作,你將不得不確保源是在開始。 Stream.Seek()將幫助你。 –