2011-08-22 87 views
5

我有一个Web窗体,允许用户在我们的系统中打开票证时上传文件。 上传使用“ajax控件工具包”asyncFileUpload控件完成。ASP.NET - 存储临时文件

这个想法是将文件保存到临时目录,并且只有当用户点击“提交”按钮时才将它们保存到永久位置。

我希望能够摆脱不再相关的临时文件(例如,用户在不发布表单的情况下将用户离开页面一个月)。

永久保留临时文件的最佳方法是什么? 也许让他们的文件在会话中? 也许让他们在视图状态?

我可以通过超时添加一些JS到页面,并添加一些用户离开页面时运行的代码。但这些想法是客户端解决方案。我不希望有人篡改代码,并在我的系统上留下垃圾。

还有其他想法吗?

感谢, Summerbulb

+0

这是什么意思?它是服务器上的临时位置,还是完全不想下载文件? – Ankit

+0

@Ankit:仅当用户决定发布表单时才需要这些文件。否则,他们应该被清除。 – summerbulb

回答

3

我的建议是在Global.asax中添加一个On_SessionEnd处理程序,并在用户会话结束时删除临时文件。你可以命名附加SessionID的临时文件给它们(或者预先设置SessionID,无论你想要什么),这样你只会删除会话结束的用户的文件。您还可以将一个On_Application_End处理程序添加到Global.asax以删除临时目录中的所有文件。

7

也许让他们文件的会议?

不会。这会不必要地使用大量的服务器内存,用户可能通过上传大文件而对整体服务器性能产生不利影响。

也许让他们在视图状态?

号这实际上意味着,每一个后回将涉及上载(下载)再次文件没有任何理由。应用程序性能会显着下降,并且提供糟糕的用户体验(更不用说通过带宽吃饭,这可能会花费你的钱)。


这些文件正在存储在服务器的临时位置,对吧?应用程序跟踪某种数据存储中的文件信息(我假设一个SQL数据库)?我建议有一个单独的应用程序来处理清理,特别是因为你正在谈论一个月的规模。

Windows服务或计划的控制台应用程序可以很好地完成这项工作。它可以定期检查目录和数据库,并根据您提供的任何规则执行一些清理。甚至可以使用票务系统中可能存在的任何消息传递机制来通知用户此操作,通知管理员等。

+1

如果你确实有一个SQL Server,请考虑每晚运行的SSIS包。你几乎可以用它做任何事情,并且计划安排很简单。节拍有另一个完整的应用程序来跟踪。 – Bill

+0

+1。服务是正确的路要走。另一种方法是检查sessionStart事件中是否有太旧的文件,但服务器需要删除文件的时间,用户必须等待第一次访问。我建议使用这种服务的这个 – citronas

+0

@citronas:的确,我肯定会远离任何网站事件这样的事情。这是一个基于时间的操作,而不是请求/响应操作(这是Web应用程序的用途)。我也喜欢比尔对SSIS的建议,我对维护这些建议不太熟悉。 (我认为“有另一个完整的应用程序来跟踪”也是微不足道的,但这不是在这里,也不是在那里。在服务器上安排一个预定作业的整体观点仍然存在。) – David

1

您可以将文件存储在用户的临时文件夹中。这是否是在您的特定情况的好方法,我不能肯定地说:

var dir = System.IO.Path.GetTempPath(); 

的路径将取决于当前的(Windows)中的用户,虽然。

http://msdn.microsoft.com/en-us/library/system.io.path.gettemppath.aspx

+0

这怎么可能?你的意思是保存在服务器的TEMP文件夹中?然后再次,服务器必须重新启动临时文件夹清理之前或类似的东西。 – highwingers

0

在提交可以发出System.IO.File.Move()命令。如果您有权访问服务器来执行此操作,则可以使用服务或控制台应用程序删除其余文件。