[英]Persisting Child Objects when the Parent is incomplete in a web application
我正在尝试建立最佳实践,以在父对象不完整或Web应用程序中不存在时处理创建子对象。 我想以无状态的方式处理此问题,以便内存中的对象消失。
例如,假设我们有一个错误跟踪应用程序。
Bug包含标题和描述(均为必需)以及任意数量的附件。 因此,“错误”是具有“附件”子项列表的父对象。
因此,您将在页面上显示标题输入,描述输入和文件输入以添加附件。 人们随后添加了附件,但是我们还没有创建父级Bug。
您如何处理保留添加的附件?
显然,我们必须跟踪添加的附件,但是此时我们还没有持久化父“ Bug”对象来将“附件”附加到该对象。
通常,在用户提交表单之后,我通常会在同一HTTP响应中创建Bug对象及其子对象Attachment对象。
如果我没看错,那么用户输入将包含一个表单,其中包含上述字段的错误标题,描述和附件。 用户填写这些字段(包括选择要上传的文件),然后单击Submit之后,您的应用程序将同时接收所有这三部分数据,作为HTTP请求中的POST变量。 (附件只是POST数据的另一部分,如RFC 1867中所述 。)
从您的应用程序开始,根据所使用的框架类型,可能会为您提供一个文件名,该文件名指向某个合适的临时目录中上载文件的位置。 例如,使用Perl的CGI模块,您可以执行以下操作:
use CGI qw(:standard);
my $query = CGI->new;
print "Bug title: " . $query->param("title") . "\n";
print "Description: " . $query->param("description"). "\n";
print "Path to uploaded attachment: " . $query->param("attachment") . "\n";
以获得上传文件的名称(为方便起见,用户通过表单发送的文件数据会自动保存在临时文件中)。 由于您可以同时访问文本字段数据和文件附件,因此可以按任意顺序创建Bug和附件对象,而无需在HTTP响应中保留任何不完整的数据。
还是我在这里不了解你?
创建不完整的错误,并定义处理不完整的过程。 (请等待X分钟/小时/天,然后将其删除/通过电子邮件发送给某人/直接接受。)即使没有标题或说明,也要知道出现问题并且附件中的信息可能有用。 附件可能包含完整的描述,但用户只是将其放在您未参加的地方。 或者,它可能仅包含分散的数据点,这些数据点本身没有意义-但是可以证实其他用户的报告。
在这种情况下,我会考虑将附件存储在某种类型的临时存储中,例如会话状态,文件系统上的临时目录或数据库。 一旦错误被保存,我便将附件复制到它们的实际位置。
不过,请谨慎处理会话,如果让他们上传大型附件,则可能会根据您的环境推送内存问题。
我之前看到的一种方法是,用户打开新的错误表单后,数据库中就会生成一个新的错误。 取决于您的应用,这可能不是好事。 例如,如果您从用户那里收集数据,这将很有用,因为即使他们无法输入数据并离开站点,您也可以获得一些情报。 您仍然知道他们开始了该过程,以及您收集的其他任何信息(例如用户代理等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.