AWS C# S3 SDK用MemoryStream替代FileStream无法获取完整文件问题
问题根因
你的代码存在3个核心错误:
- 仅声明了
MemoryStream实例,从未把S3响应流的数据写入到MemoryStream中,自然读取不到完整内容,甚至读不到任何数据,这也是你即便重置了流位置也无效的核心原因。 - 不管是
FileStream还是MemoryStream,在执行CopyTo写入操作后,流的当前位置Position都会停在写入的最后一位,此时直接读取会从末尾开始读,拿不到有效数据。你测试时FileStream能正常运行属于巧合:大概率是你测试时用的是之前已经写入完成的本地文件,或是实际运行的代码和贴出的版本存在差异。 - 当前实现没有对
MemoryStream、FileStream、XmlReader等非托管资源做释放处理,存在内存泄漏和资源占用风险。
修复后的参考代码
internal object ReadDataContractFromFile(string filename, Type type) { GetObjectRequest getObjRequest = new GetObjectRequest { BucketName = bucketName, Key = filename }; using (GetObjectResponse getObjResponse = s3Client.GetObject(getObjRequest)) using (Stream responseStream = getObjResponse.ResponseStream) using (MemoryStream memoryStream = new MemoryStream()) { // 将S3响应流写入内存流 responseStream.CopyTo(memoryStream); // 重置流位置到起始点,才能正常读取完整内容 memoryStream.Position = 0; XmlReaderSettings rs = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment, }; using (XmlReader r = XmlReader.Create(memoryStream, rs)) { return new DataContractSerializer(type).ReadObject(r); } } }
如果需要同时将文件保存到本地,可在内存流写入完成重置位置后,再将内存流的内容复制到FileStream即可。
内容的提问来源于stack exchange,提问作者zaidabuhijleh
相关产品推荐
相关产品推荐

