Промежуточное ПО Laravel отменяет запрос и сохраняет страницу в том же состоянии
Вот моя текущая проблема.
На данный момент у меня есть страница с элементами, которые могут быть добавлены и добавлены через AJAX. Эти элементы содержат формы, загрузки изображений и т. Д.
У меня во всем приложении есть промежуточное ПО, которое проверяет размер любого загружаемого изображения в любой момент времени и проверяет, что оно меньше 5 МБ (проверка изображения для каждой загрузки изображения в приложении не является опцией, это должен быть 1 контроллер, который поддерживает все проверки загрузки изображений).
Если запрос обнаружит изображение размером более 5 МБ, он запустит этот код
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())
не работает, потому что он все еще обновляет страницу и удаляет все загруженное, добавленное и добавленное в этом экземпляре.
Мне нужно иметь возможность отменить запрос, если он потерпит неудачу.
На простом английском языке, когда запускается это промежуточное ПО, обнаруживаются все изображения. Если изображение размером более 5 МБ, не обновляйте страницу или что-либо еще. Просто ошибка
Я знаю, что это кажется глупым, потому что запрос не может передать что-то обратно без обновления, но я подумал, что можно спросить / открыть для предложений.
Вот мое промежуточное ПО
<?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);
}
}
1 ответ
Если вы планируете, чтобы страница находилась в одном и том же состоянии, вы не можете сказать ей, чтобы она перенаправляла назад с ошибками, вам придется возвращать массив, или строку, или что-то еще, что вам нужно. Говоря перенаправить в обратном направлении, он говорит браузеру, где перемещаться.
Что касается поддержки входных данных, вы можете попробовать что-то из этих строк:
<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, а также к вашей собственной проверке.