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);
}
我在上传webm时
dd($request->file('file'),$gallery->type);
returns
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\File\UploadedFile
您将看到构造函数具有以下分配:
$this->mimeType = $mimeType ?: 'application/octet-stream';
这似乎就是您将 application/octet-stream
作为您的 Mime 类型的原因。
因为 Laravels request->file('file');
returns symfony\Httpfoundation\File\UploadedFile
的实例 - 在构造对象时对文件执行一些检查 - 我猜想无论发生什么错误检测到导致 Laravel 假定没有文件已上传,因此不执行验证。
无论哪种方式,文件都不会进入您的服务器,这很好。顺便说一下,你应该可以调用 $request->file('file')->getErrorMessage()
;它应该告诉你它认为问题出在哪里。
您好,我目前正在 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);
}
我在上传webm时
dd($request->file('file'),$gallery->type);
returns
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\File\UploadedFile 您将看到构造函数具有以下分配:
$this->mimeType = $mimeType ?: 'application/octet-stream';
这似乎就是您将 application/octet-stream
作为您的 Mime 类型的原因。
因为 Laravels request->file('file');
returns symfony\Httpfoundation\File\UploadedFile
的实例 - 在构造对象时对文件执行一些检查 - 我猜想无论发生什么错误检测到导致 Laravel 假定没有文件已上传,因此不执行验证。
无论哪种方式,文件都不会进入您的服务器,这很好。顺便说一下,你应该可以调用 $request->file('file')->getErrorMessage()
;它应该告诉你它认为问题出在哪里。