我有一个网络表单,允许用户在我们的系统中打开票证时上传文件。 上传是使用“ajax控件工具包”asyncFileUpload控件完成的。
我们的想法是将文件保存到临时目录,并在用户点击“提交”按钮时将它们保存到永久位置。
我希望能够摆脱不再相关的临时文件(例如,用户在不发布表单的情况下将页面打开一个月)。
永久保存临时文件的最佳方法是什么? 也许将它们保存在会话中? 也许让他们保持在观察状态?
我可以在超时时向页面添加一些JS,并添加一些在用户离开页面时运行的代码。但这些想法是客户端解决方案。我不希望有人篡改代码并在我的系统上留下垃圾。
还有其他想法吗?
谢谢, Summerbulb
答案 0 :(得分:7)
也许将它们保存在会话中?
没有。这会不必要地使用大量服务器内存,用户可能会通过上传大文件对您的整体服务器性能产生负面影响。
也许让他们留在观察状态?
没有。这实际上意味着每个回发都会涉及无理由再次上传(和下载)文件。应用程序性能会显着降低并提供糟糕的用户体验(更不用说通过带宽吃掉,这可能会花费你的钱)。
文件存储在服务器上的临时位置,对吗?应用程序跟踪某种数据存储中的文件信息(我假设是一个SQL数据库)?我建议有一个单独的应用程序来处理清理,特别是因为你正在谈论一个月的规模。
Windows服务或预定的控制台应用程序可以正常工作。它可以定期检查目录和数据库,并根据您提供的规则执行一些清理。甚至可以使用票务系统中可能存在的任何消息传递机制来通知用户此操作,通知管理员等。
答案 1 :(得分:3)
我的建议是在Global.asax中添加一个On_SessionEnd处理程序,并在用户会话结束时删除临时文件。您可以将附加SessionID的临时文件命名为它们(或者根据需要添加SessionID),这样您只会删除会话结束的用户的文件。您还可以向Global.asax添加On_Application_End处理程序以删除临时目录中的所有文件。
答案 2 :(得分:1)
您可以将文件存储在用户的临时文件夹中。在您的特定情况下,这是否是一种好方法,我无法肯定地说:
var dir = System.IO.Path.GetTempPath();
但路径将取决于当前(Windows)用户。
http://msdn.microsoft.com/en-us/library/system.io.path.gettemppath.aspx
答案 3 :(得分:0)
在提交时,您可以发出System.IO.File.Move()命令。如果您有权访问服务器,则可以使用服务或控制台应用程序删除其余文件。