Промежуточное ПО 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 МБ, не обновляйте страницу или что-то еще. Просто ошибка

Я знаю, что это кажется глупым, потому что запрос не может передать что-то без обновления, но я подумал, что 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);
    }
}

person S_R    schedule 17.05.2018    source источник
comment
Сделайте вызов ajax для проверки выбранных изображений, если он пройдет, отправьте форму. (Это предположение, не знаю, как это сделать!)   -  person iamab.in    schedule 17.05.2018


Ответы (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, а также к вашей собственной проверке.

https://laravel.com/docs/5.2/validation#rule-mimetypes

person abr    schedule 17.05.2018
comment
Спасибо за предложение, но причина, по которой мне пришлось сделать это с помощью промежуточного программного обеспечения, заключается в том, что я унаследовал проект, а слишком много контроллеров используют загрузку изображений. Я не думаю, что смогу просмотреть их все и отправить их все по запросу, но я не могу рисковать пропустить что-то одно. Глобальное промежуточное ПО показалось мне лучшим вариантом - person S_R; 17.05.2018
comment
Я отредактировал сообщение, попробуйте добавить старое ('значение') к входным данным - person abr; 17.05.2018