Laravel 5表单验证失败时保持上传数据

时间:2017-02-14 16:38:00

标签: php laravel-5

我正在开发一个Laravel项目,我为表单页面设置了路径,它在GET上显示表单并在POST上分析它:

Route::get('/update-data', [
    'as'   => 'user.settings.edit-data',
    'uses' => 'UserController@editData',
]);
Route::post('/update-data', [
    'as'   => 'user.settings.update-data',
    'uses' => 'UserController@updateData',
]);

在此表单中,我要求用户用文本填写两个字段,并且还要求他们上传两个文件。这两个文件必须是jpeg,png或pdf。在控制器中我有:

$this->validate($request,
    [
        'phone' => 'required',
        'email' => 'required|email',
        'file1' => 'required|mimes:jpeg,png,pdf',
        'file2' => 'required|mimes:jpeg,png,pdf',
    ]);

如果成功,则代码将继续执行并保存所有内容,但如果不成功,则会将用户重定向回表单。有没有办法让文件选择,以便用户不需要再次查找?

1 个答案:

答案 0 :(得分:0)

我建议使用服务器端代码验证(不是javascript,虽然从用户的角度来看两者都很好(但显然不依赖于js验证)。

我通常在Laravel中这样验证(我不是他们内置验证器的最大粉丝)。然后在验证之后,您可以使用Laravel的File类来获取文件名并将数据重新发布到视图中:

SELECT ta.FirstN, ta.LastN, tbc.*
FROM
    (SELECT UserID, tblc.*
    FROM TableB AS tblb
    CROSS APPLY(
       SELECT TOP(1) * 
       FROM TableC AS tblc 
       WHERE tblb.ViewID =  tblc.ViewID
         AND LogDate >= CAST(CURRENT_TIMESTAMP AS DATE)
         AND LogDate < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE))
       ORDER BY LogDate DESC
       ) tblc
    WHERE Status = 1
    ) tbc
 LEFT JOIN TableA ta ON ta.UserID = tbc.UserID;

或者如果您更喜欢非外观方式:

$file     = Request::file('file1');
$accepts  = ['jpeg', 'png', 'pdf']; 
$ext      = $file->getClientOriginalExtension();
$filename = $file->getClientOriginalName();

if( !in_array($ext, $accepts) )
{
  return view('your-view')->withErrors('Invalid File Format');
}
else
{
  //File has one of the correct extensions, 
  //return the filename to the view so it can be
  //re-displayed in the input
  return view('your-view', ['filename' => $filename]);
}

这利用了Laravels File类。