从服务器下载文件,然后在服务器上删除

时间:2010-02-01 23:59:22

标签: c# asp.net download response

好的我正在从服务器下载文件,我计划删除在客户端下载后在服务器上下载的文件..

我的下载代码工作正常,但我不知道何时将命令删除该文件。

string filepath = restoredFilename.ToString();

            // Create New instance of FileInfo class to get the properties of the file being downloaded
            FileInfo myfile = new FileInfo(filepath);

            // Checking if file exists
            if (myfile.Exists)
            {

                // Clear the content of the response
                Response.ClearContent();

                // Add the file name and attachment, which will force the open/cancel/save dialog box to show, to the header
                Response.AddHeader("Content-Disposition", "attachment; filename=" + myfile.Name);

                //Response.AddHeader("Content-Disposition", "inline; filename=" + myfile.Name);
                // Add the file size into the response header
                Response.AddHeader("Content-Length", myfile.Length.ToString());

                // Set the ContentType
                Response.ContentType = ReturnExtension(myfile.Extension.ToLower());

                //// Write the file into the response (TransmitFile is for ASP.NET 2.0. In ASP.NET 1.1 you have to use WriteFile instead)
                Response.TransmitFile(myfile.FullName);

                // End the response
                Response.End();

            }

现在我知道response.End()将停止所有事情并返回值,所以还有另一种方法吗?

我需要调用一个函数

  

DeleteRestoredFileForGUI(restoredFilename);

删除文件但不知道放在哪里..我尝试在Response.End()之前和之后放置但是它不起作用..

感谢任何帮助...谢谢

4 个答案:

答案 0 :(得分:5)

添加

Response.Flush();
DeleteRestoredFileForGUI(restoredFilename);

调用TransmitFile()并抛弃对Response.End()的调用(你不需要它)。

如果这不起作用,则抛弃TransmitFile()并使用:

Stream s = myFile.OpenRead();
int bytesRead = 0;
byte[] buffer = new byte[32 * 1024] //32k buffer
while((bytesRead = s.Read(buffer, 0, buffer.Length)) > 0 &&
      Response.IsClientConnected)
{
   Response.OutputStream.Write(buffer, 0, bytesRead);
   Response.Flush();
}

答案 1 :(得分:2)

您无法立即删除该文件,因为它可能尚未下载。从服务器端,没有简单的方法来告诉文件已成功下载。如果浏览器打开了打开/保存对话框怎么办?在确认对话框之前,不会开始下载。 (这可能不会立即和/或对话框可能被取消) 或者,如果它是一个大文件并且连接在完全下载之前被删除了怎么办?应该可以再次尝试下载吗?

通常建议的处理您的情况的方法是将删除作为一个单独的进程进行,经过一段时间后,您可以(相当)确定不再需要该文件和/或可以重新创建/恢复该文件如果需要的话。

根据您的情况,您可以有一个单独的进程,定期删除/处理旧文件。或者,如果您的流量较低,则每次请求新文件时都可以检查并删除旧文件。

旧文件的识别可能基于文件时间或darabase中的相​​关值。无论哪种方式,如果有可能要处理的文件很多,如果不太可能识别要删除的大量文件,则不太可能需要经常检查的开销。 另外,请务必尽快解决大量未被删除的文件(磁盘空间确实存在问题?)的后果,以防止在需要时可能删除它们的副作用,或者通过热心检查来创建性能副作用。

答案 2 :(得分:0)

你所遵循的一般模式让我很奇怪,你这样做吗?

  1. 为客户创建数据并保存到
  2. 磁盘传输文件到客户端删除
  3. 文件
  4. 如果您愿意,可以将系统更改为在内存中工作。由于内存是在.Net中管理的,因此您无需进行此手动清理,并且根据文件的大小,这可能会更快一些:

    1. 为客户创建数据并保存到MemoryStream
    2. 将流传输到客户端

答案 3 :(得分:0)

由于您在标题中设置了文件名,因此有两个选项:

  1. 将文件内容读入字符串,删除文件,回显/打印字符串作为邮件正文。

  2. 将文件重命名为delete-filename.xxx,然后让一些外部进程(可能是一个cron作业?)落后并删除以该前缀开头的所有文件。