Я хочу проверить загрузку файла рядом с проверкой других полей ввода. Это звучит не так сложно, но если я выберу файл, а затем отправлю форму, файл будет также временно загружен, когда будут обнаружены ошибки других входов.Загрузка файла PHP + Проверка формы
Таким образом, пользователь должен исправить эту ошибку и затем выбрать файл снова :(Есть ли способ из дружественной реализации пользовательского
Моей текущая реализация выглядит почти следующим образом:.?
I имеет простую форму, как это:
<form method="post" enctype="multipart/form-data">
<input type="text" name="firstname" value="<?php echo $form->getFirstname() ?>" />
<input type="text" name="lastname" value="<?php echo $form->getLastname() ?>" />
<input type="file" name="file" />
<input type="hidden" name="terms" value="false"/>
<input type="checkbox" name="terms" value="terms" <?php if ($form->getTerms() === 'terms') echo 'checked' ?> />
<input type="submit" name="send" value="send" />
</form>
Таким образом, после отправки этой формы, все пользовательские данные, такие как Firstname, и фамилия условия будут установлены и проверены, как:
if (isset($_POST['send']) && $_POST['send'] === 'send') {
if (!\Fox\Validator::isString($_POST['firstname'])) {
\Fox\Validator::setError(1, 'firstname required');
} else {
$form->setFirstname($_POST['firstname']);
}
// ... other unimportant validations
// validate file upload
if (!isset($_FILES['file']['error']) || is_array($_FILES['file']['error'])) {
\Fox\Validator::setError(10, 'error occurred');
} else {
// check error value
switch ($_FILES['file']['error']) {
// file exists
case UPLOAD_ERR_OK:
// check filesize (max filesize 100mb)
if ($_FILES['file']['size'] > 104857600) {
\Fox\Validator::setError(10, 'max filesize overridden');
} else {
$finfo = new finfo(FILEINFO_MIME_TYPE);
// define allowed mime types
$allowedMimeTypes = array(
'jpg' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif',
'bmp' => 'image/bmp',
'bmp' => 'image/x-ms-bmp',
'bmp' => 'image/x-windows-bmp',
'mov' => 'video/quicktime',
'avi' => 'video/avi',
'avi' => 'video/msvideo',
'avi' => 'video/x-msvideo',
'mp4' => 'video/mp4',
'mpeg' => 'video/mpeg',
'mkv' => 'video/x-matroska',
'flv' => 'video/x-flv',
'wmv' => 'video/x-ms-wmv',
);
if (false === $ext = array_search($finfo->file($_FILES['file']['tmp_name']), $allowedMimeTypes, true)) {
\Fox\Validator::setError(10, 'file not supported');
}
}
break;
case UPLOAD_ERR_NO_FILE:
\Fox\Validator::setError(10, 'no file selected');
break;
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
\Fox\Validator::setError(10, 'filesize overridden');
break;
default:
\Fox\Validator::setError(10, 'error occurred');
}
}
// check if form errors exists
if (empty(\Fox\Validator::getError())) {
// create unique filename
$tmp = sha1_file($_FILES['file']['tmp_name']);
// move file
if (!move_uploaded_file($_FILES['file']['tmp_name'], sprintf('./Files/%s.%s', $tmp, $ext))) {
\Fox\Validator::setError(10, 'error by uploading file');
} else {
header("Location: $successPage");
}
}
}
Таким образом, если ошибок формы не существует, файл будет загружен правильно, и пользователь будет перенаправлен на страницу успеха, но если произошла ошибка, так как пользователь пропустил требуемое поле ввода, например firstname, файл будет загружен через действие отправки тоже, но не сохранено, поэтому пользователю необходимо исправить ввод с ошибками и снова выбрать файл.
Вы хотите, чтобы на входе был выбран тот же файл? – Sayed
imo, один из способов сделать это: 1) файл загружается, и вы перемещаете его в «временную промежуточную область», пока не будет проверена вся другая информация. 1 a] Вы говорите пользователю, что загрузка файла была в порядке, но ждут каких-либо разрешений, которые вам нужны. 2) вы переместите его в «постоянную область». Вы говорите пользователю, что проверка данных хороша. Это все проверки валидации на стороне сервера. Вы очищаете «временную промежуточную зону» каждые несколько часов. –
@phplover да, но это невозможно, или я не прав? – Fox