2011-10-06 90 views
3

我正在使用MVC3來返回在代碼中創建的臨時文件。然後,我使用FileStreamResult將此文件傳輸回客戶端。但是,由於這是一個我不再需要的臨時文件,因此我想清理該文件。我不知道該怎麼做,因爲我已經在播放流媒體時碰到了return語句。謝謝。使用FileStreamResult刪除臨時文件

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")); 
    } 
} 

回答

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對象,而不僅僅是文件流。

2

看起來像確切適合創建自定義ResultFilter。你可以直接子類ActionFilterAttribute。東西沿着這些路線

public class ResultFilter : ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     string fileName = //((FileStreamResult)filterContext.Result). ??? 

     File.Delete(fileName); 
    } 
} 

你可以通過繼承FileStreamResult沿着臨時文件名通過創建自定義的ActionResult(文件名檢測的缺失部分)。然後刪除將是微不足道的。