这是我目前的问题。
目前,我有一个页面,其中包含可以通过AJAX添加和追加的元素。这些元素包含表单,图片上传等。
我的整个应用程序中都有一个中间件,用于检查在任何给定时间上传的任何图像的大小,并确保其低于5MB(对于应用程序上的每个图像上传的图像验证不是一个选项,它必须是1保持所有图像上传验证的控制器。)
如果请求检测到超过5MB的图像,则会运行此代码
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!'));
这段代码很有气质,而且这就是为什么。
当页面返回时,我需要页面处于完全相同的状态。这意味着所有AJAX加载的元素,所有图像,所有内容都需要处于相同的状态,因此redirect()->back()->withInput($request->all())
不起作用,因为它仍然刷新页面并删除在该实例中附加和添加的所有内容。
如果请求失败,我需要能够取消该请求。
简单来说,运行此中间件时,检测所有图像。如果图像超过5MB,请不要刷新页面或任何内容。只是错误
我知道这看起来很傻,因为请求无法在没有刷新的情况下传递回来,但我认为id要求/开放建议。
这是我的中间件
<?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);
}
}
答案 0 :(得分:0)
如果您打算让页面处于相同状态,那么您无法告诉它向后重定向错误,您必须返回一个数组,字符串或任何您需要的内容。通过向后重定向,它告诉浏览器在哪里导航。
关于维护输入,您可以尝试以下几行:
<input type="text" name="firstname" id="firstname" class="form-control" value="{{ $user->firstname or old('firstname') }}">
为什么不创建表单请求?我真的怀疑你需要对你需要的每一页进行验证。在我看来,中间件应该处理身份验证和授权。
表单请求类似于:
<?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'
];
}
}
在您的控制器上,您只需在函数上放置一个参数(而不是Request $ request,您可以放置Example $ request)。这样,您就可以访问Illuminate提供的每个请求信息以及您自己的验证。