2011-10-06 4 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 만들 수 있습니다 (파일 이름 감지의 누락 된 부분). 그러면 삭제는 간단합니다.