Laravel 4 验证有时会在应该失败时通过


Laravel 4 validation sometimes passes when it should fail

我正在尝试使用 Laravel 4 上传文件,但我无法让验证正常工作。

我正在通过发送 JPEG 图像、PNG 图像和 MP3 文件来测试它。我的代码如下:

$data  = ['anexo' => Input::file('anexo')];
$rules = ['anexo' => 'mimes:jpeg'];
$validation = Validator::make($data, $rules);
if ($validation->fails())
{
    // PNG fails: OK
}
else
{
    // JPEG passes: OK
    // MP3 passes: WTF?
}
// Let's see what the files looks like
var_dump($data);

以下是每个文件的 var_dump():

// JPEG
array (size=1)
  'anexo' => 
    object(Symfony'Component'HttpFoundation'File'UploadedFile)[9]
      private 'test' => boolean false
      private 'originalName' => string 'ARTcast.jpg' (length=11)
      private 'mimeType' => string 'image/jpeg' (length=10)
      private 'size' => int 310177
      private 'error' => int 0
// PNG
array (size=1)
  'anexo' => 
    object(Symfony'Component'HttpFoundation'File'UploadedFile)[9]
      private 'test' => boolean false
      private 'originalName' => string '1280x800.png' (length=12)
      private 'mimeType' => string 'image/png' (length=9)
      private 'size' => int 426169
      private 'error' => int 0
// MP3
array (size=1)
  'anexo' => 
    object(Symfony'Component'HttpFoundation'File'UploadedFile)[9]
      private 'test' => boolean false
      private 'originalName' => string '05 - Lado B Lado A.mp3' (length=22)
      private 'mimeType' => string 'application/octet-stream' (length=24)
      private 'size' => int 0
      private 'error' => int 1

我在那里错过了什么吗?

对此感到抱歉。正如@RiggsFolly注意到的那样,我上传的文件出现了错误(它超过了 php.ini 大小限制)。由于我严格关注mimeType值,我无法意识到那边的"error" => int 1

所以这里有一个解决方案,以防将来有人遇到同样的错误。此外,我发现这个Symfony'Component'HttpFoundation'File'Exception'UploadException异常,您可能正在使用它来通知系统,并可能将其捕获在您的全局变量中.php或者其他地方。

$file = Input::file('input_name')
// checks for file upload errors
if (!$file->isValid())
{
    throw new Symfony'Component'HttpFoundation'File'Exception'UploadException(
        $file->getErrorMessage(),
        $file->getError());
}
// continues with validation
$data  = ['input_name' => $file];
$rules = ['input_name' => 'mimes:jpeg'];
$validation = Validator::make($data, $rules);
if($validation->fails())
{
    // proceed with normal error treatment
}

同样,请注意,Laravel在验证时不会检查上传错误,您必须手动执行此操作。