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