Я имею многостраничную форму со смесью входов по умолчанию (текст, выбор и т. Д.) И загрузку файла ( <input type="file">
).
Я использую комбинацию класса проверки формы и загружаю библиотеку Codeigniter для отправки формы. Это отлично работает.
У меня только одна проблема, из-за которой я еще не нашел решение: если пользователь выбирает изображение, но пропускает, чтобы заполнить другое обязательное поле (например, «имя»), класс проверки формы блокирует запрос и показывает сообщение об ошибке заказчику.
Но теперь у меня проблема, что изображение уже отправлено успешно, и я не хочу, чтобы пользователь снова добавил файл. Поэтому я хочу предварительно заполнить ввод файла этими данными.
Я пробовал разные вещи, такие как:
<input type="file" name="image" value="<?php echo set_value('image','');?>" />
а также потратил время на поиск решения в Интернете, но безуспешно.
На стороне сервера вы не получаете никакой информации о том, где находится файл на компьютере клиента, поэтому в сценарии пользователя, загружающего изображение, но пользователь не заполнил остальные поля правильно, у вас есть просто опустить поле input type="file"
но сохранить хранилище, где файл находится на вашем сервере. Есть несколько способов сделать это, но все это предполагает абсолютное местоположение загруженного файла и:
<input type="hidden" name="uploadedFile" value="<?php echo $absPath; ?>" />
Затем проверяя существование $_POST['uploadedFile']
и используя это надлежащим образом. Но это не прочная идея, так как вы теперь просматриваете пути к конечному пользователю (открывает себя для вредоносной атаки). $_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']];
Бам! Теперь у вас есть полный путь к файлу, как если бы файл был загружен так же, как и раньше.
Поскольку у вас недостаточно кода, я могу дать вам достаточно инструкции, чтобы вы начали, но этого должно быть более чем достаточно.