用户下载提示后删除文件

我觉得这很简单。 我的程序将使用自动化在服务器上创build一个Excel文件。 之后,我要强制用户select是否下载,然后,不pipeselect什么,删除文件,这样不会占用空间。 任何想法如何我可以做到这一点?

您可以将文件读入input缓冲区,然后删除文件并将缓冲区发送给用户,而不是实际的文件。

很难知道用户何时已经完成了下载文件,并且在这之前不想删除它,因此我的build议是删除超过一定时间的文件,例如> 24小时。

很难确定用户是否已经完成下载文件,因为浏览器不传输这些信息,除了数据包嗅探networking数据和详细configuration您的Web服务器来pipe理其打开的连接,并且实际上相信它不会使错误,没有简单的方法。

这也取决于你如何阅读文件和它的实际大小,例如一行一行地输出到浏览器将节省内存,但它会使代码依赖于文件的存在,同时读取文件的内容缓冲区types可以让networking服务器很好地服务,但根据访问者数量,文件大小和平均下载速度,您可能随时都会有一个内存为数十GB文件的networking服务器。

只要有足够的空间存放几天的数据,并且每隔一段时间删除一个文件,就会变得更容易。

一个非常好的方法是在你的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)); } 

我知道这个问题已经问了一段时间,但是认为这个提示是有用的。

以下是诀窍的C#代码。

对于进一步的infomarion,我已经指出了从哪里find最初的想法的参考链接。 这对我有帮助。

参考链接

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

正如Microsoft KB 257757中所述 ,Microsoftbuild议不要在服务器上使用自动化:

Microsoft目前不推荐并不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)中自动化Microsoft Office应用程序,因为Office可能performance出不稳定的行为, /或Office在此环境中运行时出现死锁。

面向.NET和其他第三方库的SpreadsheetGear可以做到这一点,它们将会更快,更可靠。 SpreadsheetGear支持直接写入输出stream,因此您无需在磁盘上创build临时文件,从而获得更好的性能,而无需担心清理剩余文件的问题。

你可以在这里看到使用C#和VB源代码的ASP.NET Excel报告示例,如果你想亲自尝试,可以在这里下载一个免费试用版。

免责声明:我自己的SpreadsheetGear LLC