2012-09-30 33 views
1

在发挥框架刷新页面,是否有可能拒绝场拒绝形式没有发挥2.0.3

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

无需重新加载页面?

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

当前的行为: 之前提交形式:

Before

提交后(错误:文件都没有了)

Before

回答

3

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

如果您确实需要保留文件输入字段的值,则需要采用不同的路径:通过Ajax提交表单(谷歌为“ajax文件上传”获取某些技术和库以帮助完成此操作) ,并使用Ajax响应来指示文件是否有效。


进一步澄清:与正常的HTML/HTTP POST方法(其中播放形成佣工使用),原来的页面消失,服务器的响应是没有连接到前一页新的一页。 Play表单助手将使用先前的值预填充此页面上的输入字段,但是如上所述,这对于文件输入字段是不可能的。

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

+0

我明白。我的问题是如果有可能不必重新加载页面就拒绝表单,这样文件名就不会消失。 我可以说明使用javascript的简单验证,即检查字段是否为空 - 如果它们在提交之前抛出错误。但是,我有验证文件格式的验证,所以JS不会工作 – by0

+0

对不起,你不可能做你想要的常规表单。我为我的答案增加了一些解释。 Javascript/Ajax方法将提交表单而不重新加载页面。 –

+0

谢谢。我会看看它! – by0

3

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

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

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

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

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

它是所有关于我们有限制的工作。