[英]Delete a file after user download prompt
我觉得这很简单。 我的程序将使用Automation在服务器上创建一个Excel文件。 之后,我想强制用户选择是否下载它,然后,无论选择什么,删除文件,这样不会占用空间。 关于如何实现这一目标的任何想法?
您可以将文件读入输入缓冲区,然后删除文件并将缓冲区发送给用户而不是实际文件。
很难知道用户何时实际完成了下载文件,并且您在此之前不想删除它,因此我的建议是删除超过一定时间的文件,例如> 24小时。
很难确定用户是否已完成下载文件,因为浏览器不传输此信息,除了数据包嗅探网络数据并详细配置您的网络服务器以管理其开放连接,并且实际上相信它不会错误,没有简单的方法。
这也取决于你如何读取文件及其实际大小,例如逐行输出到浏览器将节省内存,但它会使代码依赖于文件的存在,同时将文件的内容读取到一些缓冲区将允许Web服务器正常运行,但是根据访问者数量,文件大小和平均下载速度,您可能随时拥有内存中具有数十GB文件的Web服务器。
只需要有足够的空间来存放几天的数据并且不时删除文件就更容易了。
一个非常好的方法,就是你的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建议不要在服务器上使用自动化:
" “ “
SpreadsheetGear for .NET和其他第三方库可以做到这一点,它们将更快,更可靠。 SpreadsheetGear支持直接写入输出流,因此您无需在磁盘上创建临时文件 - 提供更好的性能,而无需担心清理剩余文件。
您可以在此处查看带有C#和VB源的ASP.NET Excel报告示例,如果您想亲自试用,可以在此处下载免费试用版。
免责声明:我拥有SpreadsheetGear LLC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.