Laravel 5.1: сохранить загруженный файл в качестве старого ввода

Я использую форму в Laravel 5.1, чтобы опубликовать текст и загрузить файл. Это выглядит так (упрощенная версия):

{!! Form::open(array('url' => 'foo/bar')) !!} {!! Form::text('image_name') !!} {!! Form::file('image') !!} {!! Form::submit('Submit!') !!} {!! Form::close() !!} 

Текстовое поле требуется, поэтому я добавил в моем контроллере $validator . Если проверка не удалась, пользователь перенаправляется обратно в форму. Я использую метод withInput() для повторного заполнения формы, чтобы пользователь не мог ее снова заполнить:

 if ($validator->fails()) { return redirect()->back()->withInput(); } 

Это приведет к тому, что старый вход будет возвращен для текстовых полей, выпадающих меню и т. Д. Но если пользователь загрузил файл, выбор файла исчезнет, ​​когда проверка не удалась и его нужно снова выбрать. Есть ли способ в Laravel запомнить выбор файлов в качестве старого ввода?

Благодаря!

Нет, вход file не может быть предварительно заполнен Laravel или любым программным обеспечением. Ваш веб-сайт (и любой веб-сайт) не знает и не должен знать локальный путь к файлу. Представьте себе риски безопасности, если они это сделали! Вы можете обмануть пользователя в загрузке своего личного ключа SSH или чего-то еще.

Что вам нужно сделать, так это обрабатывать загруженный файл, даже если есть ошибки проверки.

Затем вы можете либо сохранить его в своей базе данных с pending статусом, либо присвоить ему уникальный hash с соответствующим hash хранящимся в сеансе пользователя. Дело в том, чтобы иметь возможность идентифицировать неполные загрузки, принадлежащие этому конкретному пользователю.

Затем, когда вы показываете форму, извлекаете эти неполные файлы либо из сеанса, либо из базы данных и показываете миниатюру рядом с загрузкой файла. Это говорит пользователю, что им не нужно повторно загружать этот файл. Просто убедитесь, что у них есть способ удалить его, если они передумали.

Как только форма будет отправлена ​​правильно, очистите hash сеанса или обновите состояние базы данных для complete ; что бы вы ни делали.

Кажется, что существует много вопросов по одной и той же проблеме ( Form :: file: как повторно заполнить с помощью Input :: old After Validation Errors and / or on Update? ), И все с очевидными знаниями говорят, что это невозможно.

Я бы предложил обходное решение, которое охватывает следующие цели:

  • Сохранять данные формы и файл в случае неудачной проверки Laravel
  • Используйте только проверку на стороне сервера. Вам не нужно СЛЕДУЕТ ИСПОЛЬЗОВАТЬ проверку javascript.

Ключевое слово все это AJAX . Я бы сделал следующее:

Обновление в декабре 2017 года: отправьте все поля и вложенные файлы с помощью одной AJAX POST

  1. Создайте форму AJAX (метод GET POST ), содержащий все, кроме ввода файлов. Помните, что для этого требуется отправить токен Laravel CSRF .
  2. В проверке контроллера вам нужно сделать свои ответы (неудачные или успешные), чтобы сделать вывод JSON, поэтому ваш код отправки AJAX может получить ответ в любом случае, а затем вы можете показать его в своем браузере

Таким образом, вы избегаете наличия файлов в любом временном состоянии на вашем сервере.

Более сложная, но улучшенная версия этого процесса, если вас беспокоит используемая полоса пропускания, и вы ожидаете, что ошибки в ваших полях ввода будут очень распространены, вы можете выполнить две (или более) проверки AJAX POST: первая с полями ввода только, и если все в порядке, отправьте все поля (поля ввода снова, в том числе вложенные файлы), чтобы повторить проверку и выполнить действия со всеми данными в случае успеха.