Laravel 5.1:将上传的文件保留为旧输入

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; 无论你需要做什么.


Xav*_*iQV 6

对于同一个问题似乎存在很多问题(Form :: file:如何使用Input :: old After Validation Errors和/或Update?重新填充),并且每个有明显知识的人都说这是不可能的.

我会提出一个涵盖以下目标的解决方法:

  • 在Laravel验证失败的情况下保留表单数据和文件输入
  • 仅使用服务器端验证.你不需要永远不要使用javascript验证.

这一切的关键字都是AJAX.我会做以下事情:

2017年12月更新:通过单个AJAX POST发送所有字段和附件

  1. 创建一个AJAX表单(方法GET POST),其中包含 包括文件输入之外的所有内容.请记住,它需要发送Laravel CSRF令牌.
  2. 在控制器验证中,您需要进行响应(失败或成功)以生成JSON输出,因此您的AJAX发送代码可以在任何情况下获得响应,然后您可以在浏览器中显示它

这样就可以避免服务器中的文件处于任何时态.

这个过程的一个更复杂但改进的版本,如果您担心使用的带宽并且您希望输入字段中出现错误将是非常常见的,您可以进行两个(或更多)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)