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