如何分块和流式传输文件

时间:2014-03-09 18:35:23

标签: c#

我需要使用文件来模拟流... 这是我到目前为止能够生成的......代码可以工作,但不会发生流式传输。 我对流没有经验,所以期待找到很多错误。

            Stream chunkedStream = new MemoryStream();
            var task = session.AnalyzeAsync(chunkedStream);


            FillStream(chunkedStream);


            while (!task.Wait(500))
            {

                Console.Write("\r" + ((float)chunkedStream.Position / 16000) + " Seconds");


                if (!chunkedStream.CanWrite)
                {
                    break;
                }
            }





        private static async Task FillStream(Stream chunkedStream)
        {
            var stream = Properties.Resources.ResourceManager.GetStream("Sample");
            byte[] chunk = new byte[16000];

            while (true)
            {
                Thread.Sleep(1000);


                int index = 0;
                // There are various different ways of structuring this bit of code.
                // Fundamentally we're trying to keep reading in to our chunk until
                // either we reach the end of the stream, or we've read everything we need.
                while (index < chunk.Length)
                {
                    int bytesRead = stream.Read(chunk, index, chunk.Length - index);
                    if (bytesRead == 0)
                    {
                        break;
                    }
                    index += bytesRead;
                }
                if (index != 0) // Our previous chunk may have been the last one
                {
                    // SendChunk(chunk, index); // index is the number of bytes in the chunk
                    chunkedStream.Write(chunk, 0, chunk.Length);
                }
                if (index != chunk.Length) // We didn't read a full chunk: we're done
                {
                    chunkedStream.Close();
                    return;
                }
            }
        }




       public async Task AnalyzeAsync(Stream voiceStream)
        {
            IntervalHandler();
            _StreamTask = UpStreamVoiceData(voiceStream);

            await _StreamTask;
        }

   private async Task<Result<AnalysisResult>> UpStreamVoiceData(Stream voiceStream)
        {
            HttpWebRequest webRequest = WebRequestExtensions.CreateJsonPostRequest(_actions.upStream);

            webRequest.ReadWriteTimeout = 1000000;
            webRequest.Timeout = 10000000;
            webRequest.SendChunked = true;            

            webRequest.AllowWriteStreamBuffering = false;
            webRequest.AllowReadStreamBuffering = false;

            using (var requeststream = webRequest.GetRequestStream())
            {

                await voiceStream.CopyStreamWithAutoFlush(requeststream);
                requeststream.Close();
            }

            return webRequest.ReadJsonResponseAs<Result<AnalysisResult>>();            
        }

0 个答案:

没有答案