我正在写一个字符串,MemoryStream我需要将流返回到Controller Action,所以我可以将其作为文件发送下载.
通常,我将Stream包装在using语句中,但是,在这种情况下,我需要返回它.我退货后还能处理吗?或者我需要以某种方式自行处理它?
//inside CsvOutputFormatter
public Stream GetStream(object genericObject)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream, Encoding.UTF8);
writer.Write(_stringWriter.ToString());
writer.Flush();
stream.Position = 0;
return stream;
}
Run Code Online (Sandbox Code Playgroud)
Controller返回文件的Action:
[HttpGet]
[Route("/Discussion/Export")]
public IActionResult GetDataAsCsv()
{
var forums = _discussionService.GetForums(_userHelper.UserId);
var csvFormatter = new CsvOutputFormatter(new CsvFormatterOptions());
var stream = csvFormatter.GetStream(forums);
return File(stream, "application/octet-stream", "forums.csv");
//is the stream Disposed here automatically?
}
Run Code Online (Sandbox Code Playgroud) 我想知道你是否做了类似的事情
public FileResult result()
{
Stream stream = new Stream();
return File(stream,"text/html","bob.html");
}
Run Code Online (Sandbox Code Playgroud)
如果File()会关闭你的流?因为我试图将"stream"放在using语句中,但它总是给我一个错误,说流已关闭.
public FileResult result()
{
using(Stream stream = new Stream())
{
return File(stream,"text/html","bob.html");
}
}
Run Code Online (Sandbox Code Playgroud) 我试图从派生自列表的MVC控制器返回csv文件。基于结合我从文档和SO问题中读取的内容,我提出了以下控制器代码。我一定想念一些东西,因为我因“无法访问封闭的流”而出现黄屏死机...
public class ConsumersFileController : Controller
{
private readonly TDCContext _db = new TDCContext();
public ActionResult Index()
{
IEnumerable<Consumer> list = _db.Consumers.ToList();
//put List in memory stream object
MemoryStream memoryStream = new MemoryStream();
using (memoryStream)
{
//return memory stream as file stream result:
using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream, System.Text.Encoding.UTF8, true))
{
foreach (var item in list)
{
var itemBytes = item.Serialize();
binaryWriter.Write(itemBytes.Length);
binaryWriter.Write(itemBytes);
}
FileStreamResult fileStream =
new FileStreamResult(memoryStream, "application/txt") {FileDownloadName = "zips.csv"};
return fileStream;
}
}
}
protected …Run Code Online (Sandbox Code Playgroud)