如何在 Laravel 中验证文件上传
How to Validate File Upload in Laravel
我已完成 tutorial 上传图像文件。当用户上传大于 2MB 的文件时,如何在视图中验证文件上传?
create.blade.php
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> Errors.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@if(session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<div class="form-group">
<input type="file" name="photos[]" multiple aria-describedby="fileHelp"/>
<small id="fileHelp" class="form-text text-muted">jpeg, png, bmp - 2MB.</small>
</div>
规则
public function rules()
{
$rules = [
'header' => 'required|max:255',
'description' => 'required',
'date' => 'required',
];
$photos = $this->input('photos');
foreach (range(0, $photos) as $index) {
$rules['photos.' . $index] = 'image|mimes:jpeg,bmp,png|max:2000';
}
return $rules;
}
一切正常,但是当我尝试上传大于 2MB 的文件时出现错误:
Illuminate \ Http \ Exceptions \ PostTooLargeException No message
我该如何解决这个问题并保护这个异常?
Laravel 使用其 ValidatePostSize 中间件检查请求的 post_max_size,然后如果请求的 CONTENT_LENGTH 太大则抛出 PostTooLargeException。这意味着如果在它到达您的控制器之前抛出异常。
您可以在 App\Exceptions\Handler 中使用 render() 方法,例如
public function render($request, Exception $exception){
if ($exception instanceof PostTooLargeException) {
return response('File too large!', 422);
}
return parent::render($request, $exception);
}
请注意,您必须 return 来自该方法的响应,您不能像来自控制器方法那样只 return 一个字符串。
以上响应是复制return'File too large!';你在你的问题的例子中,你显然可以把它改成别的东西。
希望对您有所帮助!
您可以尝试将自定义消息放入 message()
消息或在 Handler
class 中添加 PostTooLargeException
处理程序。类似的东西:
public function render($request, Exception $exception)
{
...
if($exception instanceof PostTooLargeException){
return redirect()->back()->withErrors("Size of attached file should be less ".ini_get("upload_max_filesize")."B", 'addNote');
}
...
}
您已在 $rules 中验证图像。试试这个代码:
$this->validate($request,[
'header' => 'required|max:255',
'description' => 'required',
'date' => 'required',
'photos.*' => 'image|mimes:jpeg,bmp,png|max:2000',
]);
在 laravel 你不能在控制器中处理这种情况,因为它不会到达 controller/customrequest 并且将在中间件中处理,所以你可以在 ValidatePostSize.php 文件中处理它:
public function handle($request, Closure $next)
{
// if ($request->server('CONTENT_LENGTH') > $this->getPostMaxSize())
{
// throw new PostTooLargeException;
// }
return $next($request);
}
/**
* Determine the server 'post_max_size' as bytes.
*
* @return int
*/
protected function getPostMaxSize()
{
if (is_numeric($postMaxSize = ini_get('post_max_size'))) {
return (int) $postMaxSize;
}
$metric = strtoupper(substr($postMaxSize, -1));
switch ($metric) {
case 'K':
return (int) $postMaxSize * 1024;
case 'M':
return (int) $postMaxSize * 1048576;
default:
return (int) $postMaxSize;
}
}
使用您的自定义消息
或在App\Exceptions\Handler:
public function render($request, Exception $exception)
{
if ($exception instanceof \Illuminate\Http\Exceptions\PostTooLargeException) {
// handle response accordingly
}
return parent::render($request, $exception);
}
其他需要更新php.ini
upload_max_filesize = 10MB
如果您不使用上述任何解决方案,则可以像使用 jQuery 一样使用客户端验证,例如:
$(document).on("change", "#elementId", function(e) {
if(this.files[0].size > 7244183) //set required file size 2048 ( 2MB )
{
alert("The file size is too larage");
$('#elemendId').value = "";
}
});
或
<script type="text/javascript">
function ValidateSize(file) {
var FileSize = file.files[0].size / 1024 / 1024; // in MB
if (FileSize > 2) {
alert('File size exceeds 2 MB');
$(file).val(''); //for clearing with Jquery
} else {
}
}
</script>
我已完成 tutorial 上传图像文件。当用户上传大于 2MB 的文件时,如何在视图中验证文件上传?
create.blade.php
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> Errors.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@if(session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<div class="form-group">
<input type="file" name="photos[]" multiple aria-describedby="fileHelp"/>
<small id="fileHelp" class="form-text text-muted">jpeg, png, bmp - 2MB.</small>
</div>
规则
public function rules()
{
$rules = [
'header' => 'required|max:255',
'description' => 'required',
'date' => 'required',
];
$photos = $this->input('photos');
foreach (range(0, $photos) as $index) {
$rules['photos.' . $index] = 'image|mimes:jpeg,bmp,png|max:2000';
}
return $rules;
}
一切正常,但是当我尝试上传大于 2MB 的文件时出现错误:
Illuminate \ Http \ Exceptions \ PostTooLargeException No message
我该如何解决这个问题并保护这个异常?
Laravel 使用其 ValidatePostSize 中间件检查请求的 post_max_size,然后如果请求的 CONTENT_LENGTH 太大则抛出 PostTooLargeException。这意味着如果在它到达您的控制器之前抛出异常。
您可以在 App\Exceptions\Handler 中使用 render() 方法,例如
public function render($request, Exception $exception){
if ($exception instanceof PostTooLargeException) {
return response('File too large!', 422);
}
return parent::render($request, $exception);
}
请注意,您必须 return 来自该方法的响应,您不能像来自控制器方法那样只 return 一个字符串。
以上响应是复制return'File too large!';你在你的问题的例子中,你显然可以把它改成别的东西。
希望对您有所帮助!
您可以尝试将自定义消息放入 message()
消息或在 Handler
class 中添加 PostTooLargeException
处理程序。类似的东西:
public function render($request, Exception $exception)
{
...
if($exception instanceof PostTooLargeException){
return redirect()->back()->withErrors("Size of attached file should be less ".ini_get("upload_max_filesize")."B", 'addNote');
}
...
}
您已在 $rules 中验证图像。试试这个代码:
$this->validate($request,[
'header' => 'required|max:255',
'description' => 'required',
'date' => 'required',
'photos.*' => 'image|mimes:jpeg,bmp,png|max:2000',
]);
在 laravel 你不能在控制器中处理这种情况,因为它不会到达 controller/customrequest 并且将在中间件中处理,所以你可以在 ValidatePostSize.php 文件中处理它:
public function handle($request, Closure $next)
{
// if ($request->server('CONTENT_LENGTH') > $this->getPostMaxSize())
{
// throw new PostTooLargeException;
// }
return $next($request);
}
/**
* Determine the server 'post_max_size' as bytes.
*
* @return int
*/
protected function getPostMaxSize()
{
if (is_numeric($postMaxSize = ini_get('post_max_size'))) {
return (int) $postMaxSize;
}
$metric = strtoupper(substr($postMaxSize, -1));
switch ($metric) {
case 'K':
return (int) $postMaxSize * 1024;
case 'M':
return (int) $postMaxSize * 1048576;
default:
return (int) $postMaxSize;
}
}
使用您的自定义消息
或在App\Exceptions\Handler:
public function render($request, Exception $exception)
{
if ($exception instanceof \Illuminate\Http\Exceptions\PostTooLargeException) {
// handle response accordingly
}
return parent::render($request, $exception);
}
其他需要更新php.ini
upload_max_filesize = 10MB
如果您不使用上述任何解决方案,则可以像使用 jQuery 一样使用客户端验证,例如:
$(document).on("change", "#elementId", function(e) {
if(this.files[0].size > 7244183) //set required file size 2048 ( 2MB )
{
alert("The file size is too larage");
$('#elemendId').value = "";
}
});
或
<script type="text/javascript">
function ValidateSize(file) {
var FileSize = file.files[0].size / 1024 / 1024; // in MB
if (FileSize > 2) {
alert('File size exceeds 2 MB');
$(file).val(''); //for clearing with Jquery
} else {
}
}
</script>