求助:上传文件需两次读取数据(无法直接赋值AllAgentsB=AllAgents)
解决FileUpload InputStream无法二次读取的问题
首先得搞明白为啥直接设置path.Position = 0不管用——FileUpload控件的PostedFile.InputStream是不可回溯的流(比如它直接来自HTTP请求的数据流,没有缓存到本地),这类流不支持设置Position属性,强行设置也不会生效,所以第二次调用ReadAgents时,流已经处于末尾,自然读不到数据。
而且你提到不能直接用AllAgentsB = AllAgents的方式复制数据,那咱们可以先把上传的流缓存到一个支持重复读取的流里,比如MemoryStream,这样就能多次读取了。
修正后的代码示例
// 先把上传的流复制到MemoryStream中缓存 using (MemoryStream ms = new MemoryStream()) { FileUpload1.PostedFile.InputStream.CopyTo(ms); // 重置流位置到开头,第一次读取数据 ms.Position = 0; ReadAgents(ms, AllAgents); // 再次重置位置,第二次读取数据 ms.Position = 0; ReadAgents(ms, AllAgentsB); }
方案可行性说明
MemoryStream是把数据存储在内存中的流,完全支持Position设置和多次读取操作。- 先把原始InputStream复制到MemoryStream,相当于把上传文件内容缓存到了内存里,后续的读取操作都基于这个缓存流,就不会出现读不到数据的问题了。
额外注意事项
- 如果上传的文件体积很大,用MemoryStream可能会占用较多内存,这时候可以考虑先把文件保存到临时文件,再从临时文件创建流进行多次读取;但对于常规大小的文件,MemoryStream足够便捷。
- 确保你的
ReadAgents方法不会在读取后关闭流(如果方法内部用using包裹流的话要留意),不过上面的代码里MemoryStream是我们自行创建的,用using包裹会自动释放资源,无需担心。
内容的提问来源于stack exchange,提问作者Dignity Dignity
相关产品推荐
相关产品推荐

