Заполнить ввод файла после формы submit / on form submit error

Я имею многостраничную форму со смесью входов по умолчанию (текст, выбор и т. Д.) И загрузку файла ( <input type="file"> ).

Я использую комбинацию класса проверки формы и загружаю библиотеку Codeigniter для отправки формы. Это отлично работает.

У меня только одна проблема, из-за которой я еще не нашел решение: если пользователь выбирает изображение, но пропускает, чтобы заполнить другое обязательное поле (например, «имя»), класс проверки формы блокирует запрос и показывает сообщение об ошибке заказчику.

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

Я пробовал разные вещи, такие как:

 <input type="file" name="image" value="<?php echo set_value('image','');?>" /> 

а также потратил время на поиск решения в Интернете, но безуспешно.

На стороне сервера вы не получаете никакой информации о том, где находится файл на компьютере клиента, поэтому в сценарии пользователя, загружающего изображение, но пользователь не заполнил остальные поля правильно, у вас есть просто опустить поле input type="file" но сохранить хранилище, где файл находится на вашем сервере. Есть несколько способов сделать это, но все это предполагает абсолютное местоположение загруженного файла и:

  1. Вставьте его обратно как скрытое значение, используя <input type="hidden" name="uploadedFile" value="<?php echo $absPath; ?>" /> Затем проверяя существование $_POST['uploadedFile'] и используя это надлежащим образом. Но это не прочная идея, так как вы теперь просматриваете пути к конечному пользователю (открывает себя для вредоносной атаки).
  2. Запуск сеанса и сохранение абсолютного пути в переменной $_SESSION , представляя пользователю простой токен в форме повторной попытки.

Я бы придерживался метода 2, поэтому, предполагая, что вы выполнили всю работу по проверке формы и загрузке файла, и ваш файл находится в $absFilePath , вы можете сделать следующее:

 session_start(); // This needs to be at the very top of you PHP file // ... $formToken = md5(time()); $_SESSION['uploadedFile'][$formToken] = $absFilePath; 

Затем визуализируйте маркер как скрытую переменную, используя:

 if (!empty($_SESSION['uploadedFile'][$formToken])) echo '<input type="hidden" name="formToken" value="'.$formToken.'" />'; 

и скрыть часть загрузки файла, используя

 if (empty($_SESSION['uploadedFile'][$formToken])) echo // <input type="file" output here... 

наконец, внутри вашего кода представления формы проверьте наличие значения formToken прежде чем пытаться загрузить $_FILES['image'] с помощью isset($_POST['formToken']) и обрабатывать его, используя:

 $absFilePath = $_SESSION['uploadedFile'][$_POST['formToken']]; 

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

Поскольку у вас недостаточно кода, я могу дать вам достаточно инструкции, чтобы вы начали, но этого должно быть более чем достаточно.