我认为这很简单。我的程序将使用自动化在服务器上创建一个Excel文件。之后,我想强制用户选择是否下载它,然后无论选择什么,都要删除该文件,以便不会占用空间。您有什么想法可以实现这一点吗?
我认为这很简单。我的程序将使用自动化在服务器上创建一个Excel文件。之后,我想强制用户选择是否下载它,然后无论选择什么,都要删除该文件,以便不会占用空间。您有什么想法可以实现这一点吗?
一个真正好的方法是在您的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));
}
很难确定用户何时实际上已经完成了文件的下载,而且您不想在此之前删除它,因此我的建议是删除一定时间以前的文件,例如 > 24 小时。
很难确定用户是否已经完成了文件的下载,因为浏览器不会传输这些信息,除非通过数据包嗅探网络数据并详细配置您的 Web 服务器来管理其打开的连接,并且确信它不会出错,否则没有简单的方法。
这还取决于您如何读取文件及其实际大小,例如逐行输出到浏览器将节省内存,但它将使代码依赖于文件的存在,而将文件内容读取到某种缓冲区将允许 Web 服务器服务它,但根据访问者数量、文件大小和平均下载速度,您可能随时拥有几十 GB 文件的 Web 服务器内存。
最好保留足够的空间存储几天的数据并定期删除文件。
我知道这个问题已经在一段时间前被问过了,但是我认为这个技巧会很有用。
以下是能够解决问题的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();
}
如Microsoft KB 257757所述,微软建议不要在服务器上使用自动化:
"微软目前不建议,也不支持从任何非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境下可能表现出不稳定的行为和/或死锁。"
.NET的SpreadsheetGear和其他第三方库可以做到这一点,并且它们将更快速和可靠。SpreadsheetGear支持直接写入输出流,因此您无需在磁盘上创建临时文件-提供更好的性能并且不必担心清理剩余文件。
如果您想自己尝试,可以在这里查看C#和VB源代码的ASP.NET Excel报告示例here并下载免费试用版here。
声明:我拥有SpreadsheetGear LLC