我认为这很简单。我的程序将使用Automation在服务器上创建一个Excel文件。之后,我想强制用户选择是否下载它,然后,无论选择什么,删除文件,这样不会占用空间。关于如何实现这一目标的任何想法?
答案 0 :(得分:9)
您可以将文件读入输入缓冲区,然后删除文件并将缓冲区发送给用户而不是实际文件。
答案 1 :(得分:1)
很难知道用户何时实际完成了下载文件,并且您在此之前不想删除它,因此我的建议是删除超过一定时间的文件,例如> 24小时。
很难确定用户是否已完成下载文件,因为浏览器不会传输此信息,除了数据包嗅探网络数据并详细配置您的网络服务器以管理其打开的连接,并且实际上相信它赢了没有错误,没有简单的方法。
这也取决于你如何读取文件及其实际大小,例如逐行输出到浏览器将节省内存,但它会使代码依赖于文件的存在,同时读取文件的内容到某种缓冲区将允许Web服务器很好地服务,但是根据访问者的数量,文件大小和平均下载速度,您可能随时拥有内存中具有数十GB文件的Web服务器。 / p>
只需要有足够的空间来存放几天的数据并且不时删除文件。
答案 2 :(得分: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));
}
答案 3 :(得分: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();
}
答案 4 :(得分:-1)
如Microsoft KB 257757中所述,Microsoft建议不要在服务器上使用自动化:
“ Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为在此环境中运行Office时,Office可能会出现不稳定的行为和/或死锁。“
SpreadsheetGear for .NET和其他第三方图书馆可以做到这一点,它们会更快,更可靠。 SpreadsheetGear支持直接写入输出流,因此您无需在磁盘上创建临时文件 - 提供更好的性能,而无需担心清理剩余文件。
如果您想亲自试用,可以使用C#和VB源here查看ASP.NET Excel报告示例并下载免费试用版here。
免责声明:我拥有SpreadsheetGear LLC