在游戏框架中,是否可以拒绝一个字段
filledForm.reject("myField", "You are missing files");
return badRequest(myform.render(filledForm));
无需重新加载页面?
我有一个文件输入字段,可让用户选择文件。在拒绝和重新加载时,文件被清除并显示错误。我希望他们选择的文件在那里
当前行为:在提交表单之前:
提交后(错误:文件已消失)
在游戏框架中,是否可以拒绝一个字段
filledForm.reject("myField", "You are missing files");
return badRequest(myform.render(filledForm));
无需重新加载页面?
我有一个文件输入字段,可让用户选择文件。在拒绝和重新加载时,文件被清除并显示错误。我希望他们选择的文件在那里
当前行为:在提交表单之前:
提交后(错误:文件已消失)
如果服务器能够操纵文件字段的值,那将是一个重大的安全风险,因为我们可以从用户硬盘驱动器中获取任何文件。如果我们看看你有两个要求,
唯一的选择是使用 AJAX 文件上传器。所以你的流程现在变成:
如果您不介意加载,您可能会作弊 - 只需使用 AJAX 进行验证以显示错误消息并让文件在正常提交时再次上传。
这一切都与我们的限制有关。
文件选择输入字段(即<input type="file" ... />
)与其他输入字段不同——您不能从服务器端预先填充值。如果可以(想想<input type="file" value="/etc/passwd" .. />
),这将是一个巨大的安全漏洞。在服务器上,当您获得提交的表单时,您不会获得上传文件的完整路径,只有文件名和内容。
如果您确实需要保留文件输入字段的值,则需要采用不同的方法:通过 Ajax 提交表单(谷歌搜索“ajax 文件上传”以获取一些帮助解决此问题的技术和库),然后使用指示文件是否有效的 Ajax 响应。
进一步说明:使用普通的 HTML/HTTP post 方法(Play 表单助手使用),原始页面消失了,服务器响应是一个新页面,与前一个页面没有连接。播放表单助手将使用以前的值预先填充此页面上的输入字段,但如上所述,这对于文件输入字段是不可能的。
这就是为什么有用于上传文件的专用 Javascript 库的原因。如果您的表单主要关注文件上传,您应该查看这些。(例如http://fineuploader.com)。在服务器端,Ajax 查询的目标将是一个新的 Action,它只处理上传的文件并返回一条成功/失败消息,然后您将向用户显示该消息。