ASP.NET - 存储临时文件

8
我有一个Web表单,允许用户在打开工单时上传文件。 上传使用"ajax控件工具包"asyncFileUpload控件完成。
想法是将文件保存到临时目录,只有当用户点击“提交”按钮时才将它们保存到永久位置。
我想能够摆脱不再相关的临时文件(例如,用户在未发布表单的情况下打开页面一个月)。
什么是不保留临时文件的最佳方式。 也许将它们保留在会话中? 也许将它们保留在视图状态中?
我可以在页面中添加一些JS并设置超时时间,以及在用户离开页面时运行的代码。但这些都是客户端解决方案。我不希望有人篡改代码并在我的系统上留下垃圾。
还有其他的想法吗?
谢谢, Summerbulb

这里的“temporary”是什么意思?是指服务器上的临时位置,还是完全不想下载文件? - Ankit
@Ankit:只有当用户决定发布表单时才需要这些文件。否则,它们应该被清除。 - summerbulb
4个回答

8

也许将文件保留在会话中?

不行。这样会不必要地占用大量服务器内存,并且用户上传大文件可能会对您的整体服务器性能产生负面影响。

也许将它们保存在视图状态中?

不行。这将有效意味着每次回发都需要无故再次上传和下载文件。应用程序的性能会显著降低,用户体验会变差(更不用说消耗带宽,这可能会花费您的资金)。


文件是存储在服务器上的临时位置中的,对吧?而且应用程序会在某种数据存储中跟踪有关文件的信息(我假设是SQL数据库)?我建议您单独开发一个应用程序来处理清理工作,特别是如果您谈论的是一个月的规模。

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


1
如果你在这背后有一个 SQL Server,请考虑每晚运行的 SSIS 包。你可以几乎做任何事情,并且调度非常容易。比跟踪另一个完整应用程序要强。 - Bill
+1. 使用服务是正确的选择。另一种选择是检查sessionStart事件,以查找过时的文件,但服务器删除文件所需的时间就是用户在第一次访问时需要等待的时间。我建议使用服务来解决这个问题。 - citronas
@citronas:确实,对于这样的操作,我肯定会远离任何站点事件。这是一个基于时间的操作,而不是请求/响应操作(这就是Web应用程序的用途)。我也喜欢Bill关于SSIS的建议,只是我不太熟悉维护它们。(我会认为“有另一个完整的应用程序来跟踪”也是微不足道的,但这既非此处也非彼处。在服务器上安排定期作业的总体目的仍然存在。) - David
虽然 Windows 服务的想法很吸引我,因为我们每天都使用这样的服务,但在这种情况下它行不通。解决方案必须是站点范围内的。Icarus 使用 On_SessionEnd 的想法听起来不错,我会研究一下。 - summerbulb

4

我建议在Global.asax中添加一个On_SessionEnd处理程序,在用户会话结束时删除临时文件。您可以将临时文件命名为附加了SessionID的名称(或者在SessionID之前添加),这样您只会删除会话已结束的用户的文件。您还可以添加一个On_Application_End 处理程序,以删除临时目录中的所有文件。


1

这怎么可能?你是说要保存在服务器的TEMP文件夹中吗?然后再次启动服务器之前,必须清理临时文件夹或类似操作。 - highwingers

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接