【问题标题】:download a file from server and then delete on server从服务器下载文件,然后在服务器上删除
【发布时间】:2010-02-01 23:59:21
【问题描述】:

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

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

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() 之前和之后放置但它不起作用..

感谢任何帮助...谢谢

【问题讨论】:

  • 运行此页面代码是否有效。而不是做 response.end() 运行 response.redirect("~/page-for-delete.aspx?file=delete.dat", false); - 通过添加 false 您继续处理此页面上的信息。
  • @Kieran,TransmitFile 将在文件传输时终止响应,而 Response.Redirect 将导致响应冲突。

标签: c# asp.net download response


【解决方案1】:

添加

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

【讨论】:

  • 对不起,试试 Response.Flush()
  • 好的,第一部分工作了......但是有没有关于不使用响应端的问题
  • Response.End 在这种情况下什么都不做,这是一条多余的行。
【解决方案2】:

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

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

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

旧文件的识别可能基于文件时间或 darabase 中的相关值。无论哪种方式,如果可能有很多文件要处理,那么如果不太可能识别要删除的大量文件,您就不太可能需要非常频繁地检查的开销。
此外,请务必降低大量文件未尽快删除的后果(磁盘空间真的是个问题吗?)以防止可能在仍需要时删除它们的副作用或通过热心检查来产生性能副作用。

【讨论】:

    【解决方案3】:

    你所遵循的一般模式让我想知道,你在这样做吗?

    1. 为客户端创建数据并保存到
    2. 磁盘传输文件到客户端删除
    3. 文件

    如果是这样,您可能会将系统更改为在内存中工作。由于内存是在 .Net 中管理的,因此您不必进行手动清理,并且根据文件的大小,这也可能会更快一些:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-21
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        • 2021-09-28
        • 2020-12-29
        相关资源
        最近更新 更多