返回文件流 - 如何知道它何时完成

时间:2014-03-03 15:33:26

标签: asp.net

我有一个控制器,它有一个返回文件的功能。该文件在服务器上生成为临时文件,然后通过HttpResponseMessage进行流式传输。我想要做的是在我发送完文件后删除文件(可能在未来我们可能会保留它们一段时间,以防再次提出完全相同的请求)。我有这样的事情:

    [HttpGet]
    public HttpResponseMessage GetReport()
    {
        string fileName = //function that creates the file and returns the filename...
        HttpResponseMessage response = new HttpResponseMessage();
        response.Content = new StreamContent(new FileStream(fileName, FileMode.Open, FileAccess.Read));
        response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
        response.Content.Headers.ContentDisposition.FileName = "test.docx";

        //File.Delete(fileName);
        return response;
    }

我无法在上面注释掉的位置删除该文件,因为该文件正在使用中。那么在流完成发送后会有一个事件或某些内容被触发,所以我可以处理删除吗?

当然,我可以开始一项任务,等待一段时间(希望足够长),然后删除,但这似乎有点昙花一现。

2 个答案:

答案 0 :(得分:1)

因为您提到将文件保留一段时间(可能),您将需要某种过期体系结构。创建一个跟踪这些临时文件系统对象的数据库表以及到期时间戳。然后,使用Windows任务计划程序或Quartz.NET等库创建计划任务,以定期查询过期对象并删除它们。

我在自己的项目中执行此操作来清理用户上传的文件,但由于用户取消了包含过程,因此不一定使用这些文件。

棘手的部分是定义成功响应的内容。响应是否成功是因为客户收到了所有数据并对其采取了行动?如果是,则只有客户端具有确定数据是否成功接收所需的所有信息。在这种情况下,客户端可能会告诉服务器它(客户端)收到并对数据采取行动。然后,服务器可以立即删除文件,也可以在我之前提到的架构中将其标记为过期。

答案 1 :(得分:1)

HttpResponseMessage是一次性的,而我的建议是定义从HttpResponseMessage派生的类,并覆盖Dispose(bool disposing)方法来清理文件。

class FileResponseMessage : HttpResponseMessage 
{
   public string FileResponseMessage(string fileName)
   {
        this.Content = new StreamContent(new FileStream(fileName, FileMode.Open, FileAccess.Read));
        this.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
        this.Content.Headers.ContentDisposition.FileName = "test.docx";
   }

   override void Dispose(bool disposing)
   {
       if(disposing)
       {
           //your cleanup
       }
   }
}
相关问题