使用FileStreamResult删除临时文件

时间:2011-10-06 19:16:56

标签: asp.net-mvc asp.net-mvc-3 download

我正在使用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"));
    }
}

2 个答案:

答案 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对象,而不仅仅是文件流。