1

在游戏框架中,是否可以拒绝一个字段

filledForm.reject("myField", "You are missing files");
return badRequest(myform.render(filledForm));

无需重新加载页面?

我有一个文件输入字段,可让用户选择文件。在拒绝和重新加载时,文件被清除并显示错误。我希望他们选择的文件在那里

当前行为:在提交表单之前:

前

提交后(错误:文件已消失)

前

4

2 回答 2

3

如果服务器能够操纵文件字段的值,那将是一个重大的安全风险,因为我们可以从用户硬盘驱动器中获取任何文件。如果我们看看你有两个要求,

  • 获取服务器上的文件内容
  • 请勿打扰客户端 UI 状态

唯一的选择是使用 AJAX 文件上传器。所以你的流程现在变成:

  • 通过AJAX上传提交文件
  • 验证内容
  • 保存文件以供以后检索
  • 发回状态(OK 或 Error)
  • 在 Error 上显示错误
  • 整个表单提交后,查找之前保存的文件

如果您不介意加载,您可能会作弊 - 只需使用 AJAX 进行验证以显示错误消息并让文件在正常提交时再次上传。

这一切都与我们的限制有关。

于 2012-09-30T11:06:11.643 回答
3

文件选择输入字段(即<input type="file" ... />)与其他输入字段不同——您不能从服务器端预先填充值。如果可以(想想<input type="file" value="/etc/passwd" .. />),这将是一个巨大的安全漏洞。在服务器上,当您获得提交的表单时,您不会获得上传文件的完整路径,只有文件名和内容。

如果您确实需要保留文件输入字段的值,则需要采用不同的方法:通过 Ajax 提交表单(谷歌搜索“ajax 文件上传”以获取一些帮助解决此问题的技术和库),然后使用指示文件是否有效的 Ajax 响应。


进一步说明:使用普通的 HTML/HTTP post 方法(Play 表单助手使用),原始页面消失了,服务器响应是一个新页面,与前一个页面没有连接。播放表单助手将使用以前的值预先填充此页面上的输入字段,但如上所述,这对于文件输入字段是不可能的。

这就是为什么有用于上传文件的专用 Javascript 库的原因。如果您的表单主要关注文件上传,您应该查看这些。(例如http://fineuploader.com)。在服务器端,Ajax 查询的目标将是一个新的 Action,它只处理上传的文件并返回一条成功/失败消息,然后您将向用户显示该消息。

于 2012-09-30T08:41:11.290 回答