IEnumerable 到Stream for FileStreamResult
我有一个IEnumerable
,它是一个方法的每个yield
语句的“流”。 现在我想将此枚举转换为Stream
以将其用作流式结果。 我有什么想法可以做到这一点?
我最终想要做的是从ASP.NET控制器操作返回Stream
作为FileStreamResult
。 此结果应作为下载流式传输到客户端。
我不想做的是在返回结果之前将IEnumerable
的全部内容写入流。 这将消除整个流媒体概念的意义。
您必须创建ActionResult类才能实现延迟评估。 您已创建了ContentResult
和FileStreamResult
类的混合,以实现类似FileStreamResult的行为,并能够设置结果编码。 好的起点是FileResult
抽象类:
public class EnumerableStreamResult : FileResult { public IEnumerable Enumerable { get; private set; } public Encoding ContentEncoding { get; set; } public EnumerableStreamResult(IEnumerable enumerable, string contentType) : base(contentType) { if (enumerable == null) { throw new ArgumentNullException("enumerable"); } this.Enumerable = enumerable; } protected override void WriteFile(HttpResponseBase response) { Stream outputStream = response.OutputStream; if (this.ContentEncoding != null) { response.ContentEncoding = this.ContentEncoding; } if (this.Enumerable != null) { foreach (var item in Enumerable) { //do your stuff here response.Write(item); } } } }
我想你可以在这里首先将你的字符串转换为字节数组,然后使用内存stram
string sourceFile = System.Web.HttpContext.Current.Server.MapPath(Path.Combine("/", "yourAddress")); byte[] byteArray = System.IO.File.ReadAllBytes(sourceFile); MemoryStream mem; using (mem = new MemoryStream()) { mem.Write(byteArray, 0, (int)byteArray.Length); return mem; }