Intereting Posts

Как проверить, загрузил ли пользователь файл в PHP?

Я делаю некоторую проверку формы, чтобы гарантировать, что файл, загруженный пользователем, имеет нужный тип. Но загрузка необязательна, поэтому я хочу пропустить проверку, если он ничего не загрузил и не отправил остальную часть формы. Как я могу проверить, что он что-то загрузил или нет? Будет ли $_FILES['myflie']['size'] <=0 работать?

Вы можете использовать is_uploaded_file() :

 if(!file_exists($_FILES['myfile']['tmp_name']) || !is_uploaded_file($_FILES['myfile']['tmp_name'])) { echo 'No upload'; } 

Из документов: возвращает TRUE, если файл с именем:

filename загружалось через HTTP POST. Это полезно для обеспечения того, чтобы злоумышленник не пытался обмануть скрипт в работе над файлами, на которых он не должен работать – например, / etc / passwd.

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

EDIT: Я использую это в своем классе FileUpload, если это помогает:

 public function fileUploaded() { if(empty($_FILES)) { return false; } $this->file = $_FILES[$this->formField]; if(!file_exists($this->file['tmp_name']) || !is_uploaded_file($this->file['tmp_name'])){ $this->errors['FileNotExists'] = true; return false; } return true; } 

@ karim79 имеет правильный ответ, но мне пришлось переписать его пример в соответствии с моими целями. В его примере предполагается, что имя переданного поля известно и может быть жестко закодировано. Я сделал этот шаг дальше и сделал функцию, которая сообщит мне, были ли какие-либо файлы загружены без необходимости знать имя поля загрузки.

 /** * Tests all upload fields to determine whether any files were submitted. * * @return boolean */ function files_uploaded() { // bail if there were no upload forms if(empty($_FILES)) return false; // check for uploaded files $files = $_FILES['files']['tmp_name']; foreach( $files as $field_title => $temp_name ){ if( !empty($temp_name) && is_uploaded_file( $temp_name )){ // found one! return true; } } // return false if no files were found return false; } 

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

Часть HTML:

 <input name="files[]" type="file" multiple="multiple" /> 

Часть PHP:

 if(isset($_FILES['files']) ){ foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){ if(!empty($_FILES['files']['tmp_name'][$key])){ // things you want to do } } 
 <!DOCTYPE html> <html> <body> <form action="#" method="post" enctype="multipart/form-data"> Select image to upload: <input name="my_files[]" type="file" multiple="multiple" /> <input type="submit" value="Upload Image" name="submit"> </form> <?php if (isset($_FILES['my_files'])) { $myFile = $_FILES['my_files']; $fileCount = count($myFile["name"]); for ($i = 0; $i <$fileCount; $i++) { $error = $myFile["error"][$i]; if ($error == '4') // error 4 is for "no file selected" { echo "no file selected"; } else { $name = $myFile["name"][$i]; echo $name; echo "<br>"; $temporary_file = $myFile["tmp_name"][$i]; echo $temporary_file; echo "<br>"; $type = $myFile["type"][$i]; echo $type; echo "<br>"; $size = $myFile["size"][$i]; echo $size; echo "<br>"; $target_path = "uploads/$name"; //first make a folder named "uploads" where you will upload files if(move_uploaded_file($temporary_file,$target_path)) { echo " uploaded"; echo "<br>"; echo "<br>"; } else { echo "no upload "; } } } } ?> </body> </html> 

см. http://www.techzigzag.com/how-to-check-that-user-has-upload-any-file-or-not-in-php/

Но будьте бдительны. Пользователь может загружать файлы любого типа, а также может взломать ваш сервер или систему, загрузив вредоносный или php-файл. В этом скрипте должны быть некоторые проверки. Спасибо.

Я проверил ваш код и подумал, что вы должны попробовать:

 if(!file_exists($_FILES['fileupload']['tmp_name']) || !is_uploaded_file($_FILES['fileupload']['tmp_name'])) { echo 'No upload'; } else echo 'upload'; 

Вы должны использовать $_FILES[$form_name]['error'] . Он возвращает UPLOAD_ERR_NO_FILE если файл не был загружен. Полный список: PHP: сообщения об ошибках

 function isUploadOkay($form_name, &$error_message) { if (!isset($_FILES[$form_name])) { $error_message = "No file upload with name '$form_name' in form."; return false; } $error = $_FILES[$form_name]['error']; // List at: http://php.net/manual/en/features.file-upload.errors.php if ($error != UPLOAD_ERR_OK) { switch ($error) { case UPLOAD_ERR_INI_SIZE: $error_message = 'The uploaded file exceeds the upload_max_filesize directive in php.ini.'; break; case UPLOAD_ERR_FORM_SIZE: $error_message = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.'; break; case UPLOAD_ERR_PARTIAL: $error_message = 'The uploaded file was only partially uploaded.'; break; case UPLOAD_ERR_NO_FILE: $error_message = 'No file was uploaded.'; break; case UPLOAD_ERR_NO_TMP_DIR: $error_message = 'Missing a temporary folder.'; break; case UPLOAD_ERR_CANT_WRITE: $error_message = 'Failed to write file to disk.'; break; case UPLOAD_ERR_EXTENSION: $error_message = 'A PHP extension interrupted the upload.'; break; default: $error_message = 'Unknown error'; break; } return false; } $error_message = null; return true; } 

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

Однако, если вы хотите проверить, загрузил ли пользователь файл, используйте $_FILES['file']['error'] == UPLOAD_ERR_OK .

См. Руководство по ошибкам при загрузке файлов . Если вы просто хотите проверить отсутствие файла, используйте UPLOAD_ERR_NO_FILE .