Я делаю некоторую проверку формы, чтобы гарантировать, что файл, загруженный пользователем, имеет нужный тип. Но загрузка необязательна, поэтому я хочу пропустить проверку, если он ничего не загрузил и не отправил остальную часть формы. Как я могу проверить, что он что-то загрузил или нет? Будет ли работать $_FILES['myflie']['size'] <=0
?
Как проверить, загрузил ли пользователь файл в PHP?
Ответ 1
Вы можете использовать is_uploaded_file()
:
if(!file_exists($_FILES['myfile']['tmp_name']) || !is_uploaded_file($_FILES['myfile']['tmp_name'])) {
echo 'No upload';
}
Из документов: Возвращает TRUE, если файл с именем:
filename было загружено через HTTP POST. Это полезно, чтобы злоумышленник не пытался обмануть script в работу над файлами на который он не должен работать - для instance,/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;
}
Ответ 2
@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;
}
Ответ 3
Этот код работал у меня. Я использую несколько загрузок файлов, поэтому мне нужно проверить, была ли какая-либо загрузка.
Часть 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
}
}
Ответ 4
Я проверил ваш код и подумал, что вы должны попробовать:
if(!file_exists($_FILES['fileupload']['tmp_name']) || !is_uploaded_file($_FILES['fileupload']['tmp_name']))
{
echo 'No upload';
}
else
echo 'upload';
Ответ 5
<!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 файл. В этом script должны быть некоторые проверки. Спасибо.
Ответ 6
is_uploaded_file()
отлично подходит для проверки, является ли это загруженным файлом или локальным файлом (для целей безопасности).
Однако, если вы хотите проверить, загрузил ли пользователь файл,
используйте $_FILES['file']['error'] == UPLOAD_ERR_OK
.
См. руководство по PHP в сообщения об ошибке загрузки файлов. Если вы просто хотите проверить отсутствие файла, используйте UPLOAD_ERR_NO_FILE
.
Ответ 7
Вы должны использовать $_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;
}