用户下载提示后删除文件

4

我认为这很简单。我的程序将使用自动化在服务器上创建一个Excel文件。之后,我想强制用户选择是否下载它,然后无论选择什么,都要删除该文件,以便不会占用空间。您有什么想法可以实现这一点吗?

5个回答

9
你可以将文件读入输入缓冲区,然后删除该文件并发送缓冲区而不是实际文件给用户。

1

一个真正好的方法是在您的global.asax文件中。

我认为SO使用了类似的东西,尽管我忘记了用于什么...(肯定是从他们那里盗用了这段代码)

private static CacheItemRemovedCallback OnCacheRemove = null;

private void AddTask(string name, int seconds)
{
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
    HttpRuntime.Cache.Insert(name, seconds, null, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnCacheRemove);
}

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // delete old spreadsheets every hour
    AddTask("DeleteDayOldSpreadsheets", 3600);

}

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
    // do stuff here
    switch (k)
    {
        case "DeleteDayOldSpreadsheets":
            // TODO: add your magic DELETE OLD SPREADSHEET code here
            break;    

        default:
            break;
    }

    // re-add our task so it recurs
    AddTask(k, Convert.ToInt32(v));
}

1

很难确定用户何时实际上已经完成了文件的下载,而且您不想在此之前删除它,因此我的建议是删除一定时间以前的文件,例如 > 24 小时。

很难确定用户是否已经完成了文件的下载,因为浏览器不会传输这些信息,除非通过数据包嗅探网络数据并详细配置您的 Web 服务器来管理其打开的连接,并且确信它不会出错,否则没有简单的方法。

这还取决于您如何读取文件及其实际大小,例如逐行输出到浏览器将节省内存,但它将使代码依赖于文件的存在,而将文件内容读取到某种缓冲区将允许 Web 服务器服务它,但根据访问者数量、文件大小和平均下载速度,您可能随时拥有几十 GB 文件的 Web 服务器内存。

最好保留足够的空间存储几天的数据并定期删除文件。


假设我无法访问将要运行的服务器。我该如何编写代码来删除24小时之前的文件,并如何安排其运行?任何想法都会有所帮助,因为我更愿意选择这种方式。 - Matthew Jones

0

我知道这个问题已经在一段时间前被问过了,但是我认为这个技巧会很有用。

以下是能够解决问题的C#代码。

如果需要更多信息,我已经标注了参考链接,那里是我找到原始想法的地方。对我很有帮助。

参考链接

private void DownloadFile()
{
    Response.ContentType = ContentType;
    Response.AppendHeader("Content-Disposition", "attachment; filename=myFile.txt");
    Response.WriteFile(Server.MapPath("~/uploads/myFile.txt"));
    Response.Flush();   
    // Delete the file just before execute Response.End()
    System.IO.File.Delete(Server.MapPath("~/uploads/myFile.txt"));
    Response.End();
}

-1

Microsoft KB 257757所述,微软建议不要在服务器上使用自动化:

"微软目前不建议,也不支持从任何非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境下可能表现出不稳定的行为和/或死锁。"

.NET的SpreadsheetGear和其他第三方库可以做到这一点,并且它们将更快速和可靠。SpreadsheetGear支持直接写入输出流,因此您无需在磁盘上创建临时文件-提供更好的性能并且不必担心清理剩余文件。

如果您想自己尝试,可以在这里查看C#和VB源代码的ASP.NET Excel报告示例here并下载免费试用版here

声明:我拥有SpreadsheetGear LLC


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接