Php Laravel中间件取消请求并保持页面处于相同状态

Php Laravel中间件取消请求并保持页面处于相同状态,php,laravel,laravel-5,laravel-validation,laravel-request,Php,Laravel,Laravel 5,Laravel Validation,Laravel Request,这是我目前的问题 目前,我有一个页面,其中包含可以通过AJAX添加和追加的元素。这些元素包含表单、图像上传等 我在我的整个应用程序上有一个中间件,它可以检查在任何给定时间上载的任何图像的大小,并确保其小于5MB(应用程序上每个图像上载的图像验证不是一个选项,它必须是一个维护所有图像上载验证的控制器) 如果请求检测到超过5MB的图像,它将运行此代码 return redirect()->back()->withInput($request->all())->withErrors(数组('Image

这是我目前的问题

目前,我有一个页面,其中包含可以通过AJAX添加和追加的元素。这些元素包含表单、图像上传等

我在我的整个应用程序上有一个中间件,它可以检查在任何给定时间上载的任何图像的大小,并确保其小于5MB(应用程序上每个图像上载的图像验证不是一个选项,它必须是一个维护所有图像上载验证的控制器)

如果请求检测到超过5MB的图像,它将运行此代码

return redirect()->back()->withInput($request->all())->withErrors(数组('Image'=>'Sorry',.$file->getClientOriginalName()'太大,最大文件大小为5MB。请减小图像的大小!')

这段代码非常喜怒无常,原因如下

我需要的网页是在完全相同的状态,我离开它,当它返回。这意味着所有AJAX加载的元素、所有图像、所有内容都需要处于相同的状态,因此
redirect()->back()->withInput($request->all())
不起作用,因为它仍然刷新页面并删除该实例中加载的附加和添加的所有内容

如果请求失败,我需要能够取消请求

简单地说,当运行此中间件时,检测所有图像。如果有超过5MB的图像,请不要刷新页面或任何内容。错误

我知道这看起来很愚蠢,因为请求不能在不刷新的情况下传递回某些内容,但我想我会询问/接受建议

这是我的中间件

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\UploadedFile;
use Symfony\Component\HttpFoundation\Response;

class ImageInterceptor
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
         foreach (array_filter(array_flatten($request->files->all())) as $file) {
             //Check if the file being uploaded is not a csv
            if($file->getClientOriginalExtension() != 'csv'){
                $filename = $file->getClientOriginalName();
                $size = $file->getClientSize(); // size in bytes! 
                $onemb = pow(1024, 2);
                if ($size > $onemb * 5) { 
                    //Return back, image is too big!
                    return redirect()->back()->withInput($request->all())->withErrors(array('Image' => 'Sorry, ' . $file->getClientOriginalName() . ' is too large, maximum file size is 5MB. Please reduce the size of your image!'));
                }
            }
        }

        return $next($request);
    }
}

如果您计划让页面处于相同的状态,那么您不能告诉它向后重定向并出现错误,您必须返回一个数组或字符串,或者您需要的任何内容。通过说重定向向后,它告诉浏览器在哪里导航

关于维护输入,您可以尝试以下几行:

<input type="text" name="firstname" id="firstname" class="form-control" value="{{ $user->firstname or old('firstname') }}">

为什么不创建一个表单请求?我真的怀疑你需要对你需要的每一页进行验证。在我看来,中间件应该处理身份验证和授权

formrequest类似于:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class Example extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
      return [
          'photo' => 'required|mimes:jpeg,bmp,png|size:5000'
      ];
    }
}

谢谢你的建议,但我之所以不得不通过中间件来实现,是因为我继承了这个项目,而且有太多的控制器使用图像上传。我不认为我可以把它们全部检查一遍,然后发送给一个请求,但我不能冒险漏掉一个。全局中间件似乎是meI的最佳选择。如果编辑了文章,请尝试将旧的(“值”)添加到输入中。对所选图像进行ajax调用以验证,如果通过,则提交表单。(这是一个猜测,不确定如何做!)