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

2022-08-30 15:03:00

我在Laravel 5.1中使用表单来发布一些文本并上传文件。它看起来像这样(简化版):

{!! Form::open(array('url' => 'foo/bar')) !!}
    {!! Form::text('image_name') !!}
    {!! Form::file('image') !!}
    {!! Form::submit('Submit!') !!}
{!! Form::close() !!}

文本字段是必需的,因此我在控制器中添加了一个。如果验证失败,用户将被重定向回表单。我使用该方法重新填充表单,以便用户不必再次填写它:$validatorwithInput()

if ($validator->fails()) {
    return redirect()->back()->withInput();
}

这将为文本字段,下拉列表等获取旧输入。但是,如果用户已上载文件,则在验证失败时,文件选择将消失,必须再次选择。在Laravel中,有没有办法将文件选择记住为旧输入?

谢谢!


答案 1

不可以,输入不能由Laravel或任何软件预填充。您的网站(以及任何网站)不知道也不应该知道文件的本地路径。想象一下,如果他们这样做,安全风险!您可以诱骗用户上传其SSH私钥或其他内容。file

您需要做的是无论如何都要处理上传的文件,即使存在验证错误也是如此。

然后,您可以将其存储在具有状态的数据库中,或者为其分配一些唯一值,并在用户的会话中存储匹配项。关键是能够识别属于此特定用户的不完整上传。pendinghashhash

然后,在显示表单时,从会话或数据库中检索那些不完整的文件,并在文件上载旁边显示缩略图。这告诉用户他们不需要重新上传该文件。只要确保他们有办法删除它,以防他们改变主意。

正确提交表单后,清除会话或将数据库状态更新为 ;无论您需要做什么。hashcomplete


答案 2

对于同一个问题,似乎有很多问题(Form::file:如何重新填充输入::旧的验证错误和/或更新后?),每个有明显知识的人都说这是不可能的。

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

  • 保留表单数据和文件输入,以防 Laravel 验证失败
  • 仅使用服务器端验证。你不需要永远不要使用javascript验证。

这一切的关键词是AJAX。我会做以下事情:

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

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

这样可以避免在服务器中将文件置于任何时间状态。

此过程的更复杂但改进的版本,如果您担心使用带宽并且预计输入字段中出现错误将非常普遍,则可以执行两个(或更多)AJAX POST验证:第一个仅具有输入字段,如果可以,则发送所有字段(再次输入字段, 现在包括附加的文件),以再次尝试验证并在成功的情况下对所有数据执行操作。


推荐