我正在使用Laravel 5.1中的表单发布一些文本并上传文件。它看起来像这样(简化版):
{!! Form::open(array('url' => 'foo/bar')) !!}
{!! Form::text('image_name') !!}
{!! Form::file('image') !!}
{!! Form::submit('Submit!') !!}
{!! Form::close() !!}
文本字段是必需的,所以我在控制器中添加了一个$validator
。如果验证失败,则会将用户重定向回表单。我使用withInput()
方法重新填充表单,以便用户不必再次填写它:
if ($validator->fails()) {
return redirect()->back()->withInput();
}
这将为文本字段,下拉列表等返回旧输入。但是,如果用户已上载文件,则在验证失败时必须再次选择文件选择。 Laravel有什么方法可以记住文件选择作为旧输入吗?
谢谢!
不,file
输入不能由Laravel或任何软件预先填充。您的网站(和任何网站)不会也不应该知道该文件的本地路径。如果他们这样做,想象一下安全隐患!您可以欺骗用户上传他们的SSH私钥或其他东西。
您需要做的是处理上传的文件,即使存在验证错误。
然后,您可以使用pending
状态将其存储在数据库中,或者为其分配一些唯一的hash
,并在用户会话中存储匹配的hash
。关键是能够识别属于该特定用户的不完整上传。
然后,当您显示表单时,从会话或数据库中检索这些不完整的文件,并在文件上载旁边显示缩略图。这告诉用户他们不需要重新上传该文件。只要确保他们有办法将其删除,以防他们改变主意。
正确提交表单后,清除会话hash
或将数据库状态更新为complete
;无论你需要做什么。
对于同一个问题(Form::file: How to repopulate with Input::old After Validation Errors and/or on Update?)似乎存在很多问题,并且每个有明显知识的人都说这是不可能的。
我会提出一个涵盖以下目标的解决方法:
这一切的关键字都是AJAX。我会做以下事情:
2017年12月更新:通过单个AJAX POST发送所有字段和附件
这样就可以避免服务器中的文件处于任何时态。
这个过程的一个更复杂但改进的版本,如果您担心使用的带宽并且您希望输入字段中出现错误将是非常常见的,您可以进行两个(或更多)AJAX POST验证:第一个带有输入字段只有,如果没问题,发送所有字段(再次输入字段,现在包括附加文件)再次尝试验证,并在成功的情况下对所有数据执行操作。