我正在使用MVC3返回在代码中创建的临时文件。然后,我使用FileStreamResult
将此文件传回客户端。但是,因为这是我不再需要的临时文件,所以我想清理文件。我不知道怎么做,因为我已经在流式传输时遇到了return语句。感谢。
public FileStreamResult Download()
{
string filename = Path.GetTempFileName();
using (FileStream stream = new FileStream(filename, FileMode.OpenOrCreate))
{
CreateFile(this.DataContext, stream);
}
using (FileStream outputStream = new FileStream(filename, FileMode.Open))
{
HttpContext.Response.AddHeader("content-disposition", "attachment; filename=MyFile.xlsx");
return new FileStreamResult(outputStream,MimeTypeUtil.GetMimeType("xlsx"));
}
}
答案 0 :(得分:3)
似乎非常适合创建自定义ResultFilter。您可以直接将ActionFilterAttribute
子类化。沿着这些方向的东西(缺少文件名检测部分)
public class ResultFilter : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
string fileName = //((FileStreamResult)filterContext.Result). ???
File.Delete(fileName);
}
}
您可以通过继承FileStreamResult
来传递临时文件名来创建自定义ActionResult。然后删除将是微不足道的。
答案 1 :(得分:1)
如果您的代码与您发布的内容相似,则可能实际上不需要临时文件。 (这假设您的方法在Controller
)内:
public ActionResult Download()
{
using (var stream = new MemoryStream())
{
CreateFile(this.DataContext, stream);
stream.Position = 0; // Not sure if this is necessary
return File(stream, MimeTypeUtil.GetMimeType("xlsx"), "MyFile.xlsx");
}
}
FileStreamResult
有点用词不当。它似乎接受任何Stream
对象,而不仅仅是文件流。