在play2.0.3中拒绝没有重新加载页面的表单
-
11-12-2019 - |
题
在play框架中,是否有可能拒绝一个字段
filledForm.reject("myField", "You are missing files");
return badRequest(myform.render(filledForm));
没有重新加载页面?
我有一个文件输入字段,允许用户选择文件。在拒绝和重新加载时,将清除文件并显示错误。我希望他们选择的文件在那里
当前行为:递交表格前:
提交后(有错误:文件都不见了)
解决方案
文件选择输入字段(即 <input type="file" ... />
)与其他输入字段不同-您不能从服务器端预先填充值。如果你能(想想),这将是一个巨大的安全漏洞 <input type="file" value="/etc/passwd" .. />
).在服务器上,当您获得提交的表单时,您不会获得上传文件的完整路径,只是文件的名称和内容。
如果你真的需要保留你的文件输入字段的值,你将需要走不同的路线:通过Ajax提交表单(谷歌为"ajax文件上传"的一些技术和库来帮助这一点),并使用Ajax响应来指示文件是否有效。
进一步澄清:使用正常的HTML/HTTP post方法(Play表单帮助程序使用的方法),原始页面消失了,服务器响应是一个与前一页没有连接的新页面。Play forms帮助程序将使用前面的值预先填充此页面上的输入字段,但如上所述,这对于文件输入字段是不可能的。
这就是为什么有特殊用途的javascript库用于上传文件。如果您的表单主要与文件上传有关,您应该查看这些。(例如 http://fineuploader.com).在服务器端,Ajax查询的目标将是一个新操作,它只处理上传的文件并返回成功/失败消息,然后将其显示给用户。
其他提示
如果服务器能够操纵文件字段的值,那将是一个主要的安全风险,因为我们可以从用户硬盘中获取任何文件。如果我们查看所需的两个要求,
- 在服务器上获取文件内容
- 请勿打扰客户端UI状态
唯一的选项是使用Ajax文件上传器。所以你的流现在变成了:
- 通过ajax上传提交文件
- 验证内容
- 保存文件以稍后检索
- 发送状态(确定或错误)
- 显示错误的错误
提交了整个表单后,查找以前保存的文件
如果您不介意负载,您可能会欺骗一下 - 只需使用Ajax进行验证来显示错误消息,并让文件在正常提交时再次上传。
它是关于我们的限制。