IEnumerable<string> to Stream for FileStreamResult

本文关键字:for Stream FileStreamResult to string lt IEnumerable gt | 更新日期: 2023-09-27 17:56:15

我有一个IEnumerable<string>,它是根据方法的yield语句"流式传输"的。现在我想将此枚举转换为Stream以将其用作流式处理结果。任何想法我该怎么做?

我最终要做的是从 ASP.NET 控制器操作中将Stream作为FileStreamResult返回。此结果应作为下载流式传输到客户端。

我不想做的是在返回结果之前将IEnumerable的全部内容写入流。这将消除流媒体概念的整个意义。

IEnumerable<string> to Stream for FileStreamResult

您必须创建 ActionResult 类才能实现延迟计算。您已经创建了ContentResult FileStreamResult类的组合,以实现像FileStreamResult这样的行为,并能够设置结果编码。 好的起点是FileResult抽象类:

public class EnumerableStreamResult : FileResult
{
    public IEnumerable<string> Enumerable
    {
        get;
        private set;
    }
    public Encoding ContentEncoding
    {
        get;
        set;
    }
    public EnumerableStreamResult(IEnumerable<string> 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);
            }
        }
    }
}

返回一个FileStreamResult,传入可枚举。ToStream():

public IActionResult Get()
{
    IEnumerable<string> lines = GetLines();
    Stream stream = lines.ToStream();
    return File(stream, "text/csv");
}

ToStream() 在 EnumerableToStream 包中实现。

我认为您可以在这首先将字符串转换为字节数组并使用内存 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;
        }