다른 입력 필드의 유효성 검사 외에 파일 업로드의 유효성을 검사하고 싶습니다. 그렇게 어렵지는 않지만 파일을 선택하고 양식을 제출하면 다른 입력 오류가있을 때 파일도 임시로 업로드됩니다.
따라서 사용자는이 오류를 수정 한 다음 파일을 다시 선택해야합니다. :(. 사용자 친화적 인 구현 방법이 있습니까?
내 현재 구현은 거의 다음과 같습니다.
다음과 같은 간단한 형태가 있습니다.
<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>
따라서이 양식을 제출 한 후 이름, 성 및 용어와 같은 모든 사용자 데이터는 다음과 같이 설정되고 확인됩니다.
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과 같은 필수 입력 필드를 놓쳐 오류가 발생하면 제출 작업을 통해 파일도 업로드됩니다. 그러나 저장되지 않았으므로 사용자는 오류가있는 입력을 수정하고 파일을 다시 선택해야합니다.
좋아, 나는 Ryan Vincent가 위의 주석에서 설명한 솔루션을 구현했으며 서버 측 유효성 검사 만 사용하고 있습니다.
따라서 다른 양식 오류가 있으면 업로드 된 파일을 통과시키고 임시 디렉터리에 업로드합니다. 그 후 양식의 파일 입력 필드를 성공 메시지와 임시 파일 이름을 포함하는 숨겨진 필드로 대체하므로 다른 양식 오류가 발생하면 파일이 여전히 임시 디렉토리에 영구적이며 다시 업로드되지 않아야합니다. 양식 오류가 발생하지 않으면 파일이 임시 디렉토리에서 대상 디렉토리로 이동됩니다.
추가로 cronjob은 특정 간격으로 임시 디렉토리를 플러시하고 사용하지 않는 파일은 삭제됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다