Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5未能保存上传数据的表单验证_Php_Laravel 5 - Fatal编程技术网

Php Laravel 5未能保存上传数据的表单验证

Php Laravel 5未能保存上传数据的表单验证,php,laravel-5,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-da

我正在从事一个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',
    ]);

如果成功,那么代码将继续执行并保存所有内容,但如果不成功,则会将用户重定向回表单。有没有一种方法仍然可以选择文件,这样用户就不需要再次查找它?

我建议使用服务器端代码进行验证(不是javascript,尽管从用户角度来看这两种代码都很好(但显然不依赖js验证)

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

$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]);
}
或者,如果您更喜欢非正面方式:

$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文件类。

也许你可以将正在验证的文件保存到一个临时位置,向用户显示一个缩略图而不是文件输入,并且只显示无效文件的文件输入。我可以这样做,或者我可以使用Javascript甚至不提交,除非它是有效的。我只是想知道是否有内置的方法可能可以返回文件名,但浏览器无法知道文件在我的计算机文件系统结构中的位置,出于安全原因,据我所知,您无法知道。我将仔细研究一下这一点:。如果您在提交无效输入后真的试图保留文件,您可能会我必须将其保存为服务器上的临时文件。遗憾的是,这是普遍的共识。相反,您还可以添加Javascript验证,以防止表单在有效之前发送。i agree:D!Gl brother。