c# - descargar - IEnumerable<cadena> a Stream para FileStreamResult
save file asp mvc (2)
Tengo un IEnumerable<string>
, que es "transmitido" por declaraciones de yield
de un método. Ahora quiero convertir este enumerable en un Stream
para usarlo como resultado transmitido. ¿Alguna idea de cómo puedo hacer esto?
Lo que finalmente quiero hacer es devolver Stream
como FileStreamResult
desde una acción de controlador ASP.NET. Este resultado debe transmitirse como descarga al cliente.
Lo que NO quiero hacer es escribir todo el contenido de IEnumerable
en la transmisión antes de devolver el resultado. Esto eliminaría todo el sentido del concepto de transmisión.
Creo que puedes usarlo en esto primero convierte tu cadena a matriz de bytes y usa memoria stram luego
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;
}
Debes crear tu clase ActionResult para lograr una evaluación diferida. Ha creado una combinación de ContentResult
y clases FileStreamResult
para lograr un comportamiento como FileStreamResult con la capacidad de establecer la codificación de resultados. Un buen punto de partida es la clase abstracta 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);
}
}
}
}