Laravel 5验证失败(未设置字段)


Laravel 5 Validation fails (field not set)

嗨,我目前正在laravel 5中编写一个图库,您可以在单独的类别中上传图像和视频,并且我得到了一个非常奇怪的验证方法问题。

图像上传本身工作良好,并做了它应该做的事情。但是,如果我尝试上传视频(mp4,webm),我的验证总是失败的错误,文件字段是必需的。但是,如果我尝试用错误的mime类型文件进行相同的操作,则所有工作都像预期的那样,并且验证方法说它是错误的mime类型。

视图如下所示:

@extends('templates.base')
@section('content')
@parent
{!! Form::open(['url' => '/gallery/upload/' .$gallery->id, 'files' => true]) !!}
<div>
    {!! $error !!}
</div>
<table>
    <tr>
        <td>
            Title:
        </td>
        <td>
            {!! Form::text('title',old('title'),['class' => 'form_text', 'min' => '3', 'max' => '255']) !!}
        </td>
    </tr>
    <tr>
        <td>
            Description:
        </td>
        <td>
            {!! Form::textarea('description') !!}
        </td>
    </tr>
    <tr>
        <td>
            File:
        </td>
        <td>
            <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
            {!! Form::file('file') !!}
        </td>
    </tr>
    <tr>
        <td>
            External:
        </td>
        <td>
            <select name="external">
                <option value="0" default>No</option>
                <option value="1">Yes</option>}
            </select>
        </td>
    </tr>
    <tr>
        <td>{!! Form::submit(trans('strings.create'),['class' => 'form_submit news']) !!}</td>
    </tr>
</table>
{!! Form::close() !!}
@stop

控制器看起来像这样:

if (config('gallery.allowUploads')) {
        if (config('gallery.allowUserUploads')) {
            $gallery = Gallery::find($request->route('id'));
            if (is_null($request->route('id')) || count($gallery) <= 0) {
                return redirect()->back();
            }
            if ($request->isMethod('post')) {
                if ($gallery->type == 'i') {
                    $Validator = Validator::make($request->all(), [
                        'title'       => 'required|min:3|max:255',
                        'description' => 'max:10000',
                        'file'        => 'required|mimes:jpg,jpeg,bmp,png,gif',
                        'external'    => 'required|in:0,1',
                    ]);
                } elseif ($gallery->type == 'v') {
                    $Validator = Validator::make($request->all(), [
                        'title'       => 'required|min:3|max:255',
                        'description' => 'max:10000',
                        'file'        => 'required|mimes:mp4,webm',
                        'external'    => 'required|in:0,1',
                    ]);
                } else {
                    $Validator = Validator::make($request->all(), [
                        'title'       => 'required|min:3|max:255',
                        'description' => 'max:10000',
                        'file'        => 'required|mimes:zip,rar,7z',
                        'external'    => 'required|in:0,1',
                    ]);
                }
                $error = "";
                if ($Validator->fails()) {
                    foreach ($Validator->messages()->All() as $m) {
                        $error .= $m . "</br>";
                    }
                    return view('gallery/items/create', ['gallery' => $gallery, 'error' => $error);
                }

上传网页

dd($request->file('file'),$gallery->type);

返回
UploadedFile {#29 ▼
   -test: false
   -originalName: "big-buck-bunny_trailer.webm"
   -mimeType: "application/octet-stream"
   -size: 0
   -error: 1
   }
   "v"

但是验证方法仍然说失败,因为文件字段是必需的。

我只是觉得我忽视了什么。谢谢你的帮助。

编辑:

我刚发现当我上传一个图像文件时,我得到

UploadedFile {#29 ▼
   -test: false
   -originalName: "a8b5KQQ_460s_v1.jpg"
   -mimeType: "image/jpeg"
   -size: 53991
   -error: 0
}
"v"

错误是0,在webm文件上是1,但我不确定这是什么意思。

从输出来看,文件似乎是空的,并且由于某种原因无法找到mime类型。如果你深入研究symfony ' Httpfoundation ' ' UploadedFile文件您将看到构造函数具有以下赋值:

$this->mimeType = $mimeType ?: 'application/octet-stream';

这似乎是为什么你得到application/octet-stream作为你的Mime类型。

因为Laravels request->file('file');返回一个symfony'Httpfoundation'File'UploadedFile的实例-它在对象构造时对文件执行一些检查-我猜无论检测到什么错误都会导致Laravel假设没有文件被上传,因此不执行验证。

无论哪种方式,该文件都不会传到服务器上,这很好。顺便提一下,您应该能够调用$request->file('file')->getErrorMessage();这会告诉你它认为问题出在哪里