2013-07-04 4 views
1

Я отредактировал этот код alot of times (im noob whit php) и моя проблема - загрузить многократные файлы с этим кодом. Я могу загрузить только 1 файл.PHP Загрузить несколько файлов только загрузить 1 файл

Вот код:

<?php 
/** 
* uploadFile() 
* 
* @param string $file_field name of file upload field in html form 
* @param bool $check_image check if uploaded file is a valid image 
* @param bool $random_name generate random filename for uploaded file 
* @return array 
*/ 
function uploadFile ($file_field = null, $check_image = false, $random_name = false) { 

    //Config Section  
    //Set file upload path 
    $path = 'c:/xampp/htdocs/'; //with trailing slash 
    //Set max file size in bytes 
    $max_size = 1000000; 
    //Set default file extension whitelist 
    $whitelist_ext = array('jpg','png','gif'); 
    //Set default file type whitelist 
    $whitelist_type = array('image/jpeg', 'image/png','image/gif'); 

    //The Validation 
    // Create an array to hold any output 
    $out = array('error'=>null); 

    if (!$file_field) { 
    $out['error'][] = "Please specify a valid form field name";   
    } 

    if (!$path) { 
    $out['error'][] = "Please specify a valid upload path";    
    } 

    if (count($out['error'])>0) { 
    return $out; 
    } 

    //Make sure that there is a file 
    if((!empty($_FILES[$file_field])) && ($_FILES[$file_field]['error'] == 0)) { 

    // Get filename 
    $file_info = pathinfo($_FILES[$file_field]['name']); 
    $name = $file_info['filename']; 
    $ext = $file_info['extension']; 

    //Check file has the right extension   
    if (!in_array($ext, $whitelist_ext)) { 
     $out['error'][] = "Invalid file Extension"; 
    } 

    //Check that the file is of the right type 
    if (!in_array($_FILES[$file_field]["type"], $whitelist_type)) { 
     $out['error'][] = "Invalid file Type"; 
    } 

    //Check that the file is not too big 
    if ($_FILES[$file_field]["size"] > $max_size) { 
     $out['error'][] = "File is too big"; 
    } 

    //If $check image is set as true 
    if ($check_image) { 
     if (!getimagesize($_FILES[$file_field]['tmp_name'])) { 
     $out['error'][] = "Uploaded file is not a valid image"; 
     } 
    } 

    //Create full filename including path 
    if ($random_name) { 
     // Generate random filename 
     $tmp = str_replace(array('.',' '), array('',''), microtime()); 

     if (!$tmp || $tmp == '') { 
     $out['error'][] = "File must have a name"; 
     }  
     $newname = $tmp.'.'.$ext;         
    } else { 
     $newname = $name.'.'.$ext; 
    } 

    //Check if file already exists on server 
    if (file_exists($path.$newname)) { 
     $out['error'][] = "A file with this name already exists"; 
    } 

    if (count($out['error'])>0) { 
     //The file has not correctly validated 
     return $out; 
    } 

    if (move_uploaded_file($_FILES[$file_field]['tmp_name'], $path.$newname)) { 
     //Success 
     $out['filepath'] = $path; 
     $out['filename'] = $newname; 
     return $out; 
    } else { 
     $out['error'][] = "Server Error!"; 
    } 

    } else { 
    $out['error'][] = "No file uploaded"; 
    return $out; 
    }  
} 
?> 
<?php 
if (isset($_POST['submit'])) { 
    $file = uploadFile('file', true, true); 
    if (is_array($file['error'])) { 
    $message = ''; 
    foreach ($file['error'] as $msg) { 
     $message .= '<p>'.$msg.'</p>';  
    } 
    } else { 
    $message = "File uploaded successfully"; 
    } 
    echo $message; 
} 
?> 
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data"> 
<input name="file" type="file" size="20" multiple="multiple" /> 
<input name="submit" type="submit" value="Upload files" /> 
</form> 

, пожалуйста, помогите мне понять ... я знаю, что я должен использовать Еогеасп

ответ

0

Вы должны использовать цикл Еогеасп для загрузки нескольких файлов. в рамках также вы предоставили компоненты с одним и тем же средством (например, с помощью цикла foreach).

5

Вы должны объявить поле файла в виде массива, как file[]

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data"> 
<input name="file[]" type="file" size="20" multiple="multiple" /> 
<input name="submit" type="submit" value="Upload files" /> 
</form> 

Тогда попробуйте

+0

многократный не должен быть полностью HTML5 'multiple =" несколько "' only 'multiple' достаточно, [доказательство] (http://www.w3schools.com/tags/att_input_multiple.asp) – vladkras

+0

U r right .. @ vladkras –

+0

также вы можете использовать '[]' для нескольких полей с тем же именем, но вам это не нужно, когда вы используете атрибут 'multiple' только для 1 поля – vladkras

1

Как уже отмечалось, необходимо изменить имя поля загрузки в то. файлы [] (включают квадратные скобки после имени). Это актуально, поскольку он сообщает PHP, что он должен обрабатывать поле как массив.

Кроме того, в коде, вы можете использовать Еогеасп(), чтобы получить доступ к загруженным файлам, как это:

foreach ($_FILES['field_name'] as $file) 

(очевидно, Yout HTML поля были бы имен field_name [] в данном случае) Это будет возвратите один массив в каждой из пяти итераций, предоставив вам информацию обо всех отправленных вами файлах. Например, если вы отправили два файла, это может выглядеть следующим образом:

["name"]=> 
    array(2) { 
     [0]=> 
     string(5) "dir.c" 
     [1]=> 
     string(10) "errcodes.h" 
    } 
    ["type"]=> 
    array(2) { 
     [0]=> 
     string(11) "text/x-csrc" 
     [1]=> 
     string(11) "text/x-chdr" 
    } 
    ["tmp_name"]=> 
    array(2) { 
     [0]=> 
     string(14) "/tmp/phpP1iz5A" 
     [1]=> 
     string(14) "/tmp/phpf31fzn" 
    } 
    ["error"]=> 
    array(2) { 
     [0]=> 
     int(0) 
     [1]=> 
     int(0) 
    } 
    ["size"]=> 
    array(2) { 
     [0]=> 
     int(511) 
     [1]=> 
     int(38) 
    } 
    } 

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

Надеюсь, теперь это ясно.

0

мое предложение

  1. Начало цикла: foreach ($_FILES[$file_field] as $file) { где у вас есть // Get filename строка
  2. Закрыть его с } в конце функции
  3. Изменить все $_FILES[$file_field] к $file внутри

И, конечно, вход должен иметь атрибут multiple как Шерин Хосе сказал (tut), но теперь полностью поддерживается только 8.27% браузеров, так что лучше добавить больше входов с JS, как

<input type="file" name="file[]" /> 
<input type="file" name="file[]" /> 
... 

и петли их таким же образом

0

Чтобы успешно отправлять несколько файлов из браузера, вам нужны ваши входы для передачи массива на PHP.Это делается путем добавления [] до конца вашего <input> Имени:

<input type="file" name="filesToUpload[]" multiple> 

Обработка эти файлы сложная часть. PHP обрабатывает загрузку файлов по-другому, чем обрабатывать другие данные POST или GET, предоставленные в массиве. У загружаемых файлов есть ключ метаданных, вставленный между именем ввода и индексом загруженного файла. Итак, $_FILES['filesToUpload']['name'][0] получит имя первого файла, а $_FILES['filesToUpload']['name'][1] получит имя второго файла ... и так далее.

Из-за этого foreach - это абсолютно неправильный цикл использования. В конечном итоге вы обработаете каждую часть метаданных самостоятельно, без какого-либо контекста. Это неестественно неестественно.

Давайте получим индекс каждого файла и обработаем один файл за раз. Для этого мы будем использовать цикл for. Это полностью автономный, функционирующий пример пользователем загрузки нескольких файлов в папку на сервере:

<?php 
/* 
* sandbox.php 
*/ 

if (isset($_POST['submit'])) { 

    // We need to know how many files the user actually uploaded. 
    $numberOfFilesUploaded = count($_FILES['filesToUpload']['name']); 

    for ($i = 0; $i < $numberOfFilesUploaded; $i++) { 
     // Each iteration of this loop contains a single file. 
     $fileName = $_FILES['filesToUpload']['name'][$i]; 
     $fileTmpName = $_FILES['filesToUpload']['tmp_name'][$i]; 
     $fileSize = $_FILES['filesToUpload']['size'][$i]; 
     $fileError = $_FILES['filesToUpload']['name'][$i]; 
     $fileType = $_FILES['filesToUpload']['type'][$i]; 

     // PHP has saved the uploaded file as a temporary file which PHP will 
     // delete after the script has ended. 
     // Let's move the file to an output directory so PHP will not delete it. 
     move_uploaded_file($fileTmpName, './output/' . $fileName); 
    } 
} 

?> 

<form method="post" enctype="multipart/form-data"> 
           <!-- adding [] Allows us to upload multiple files --> 
    <input type="file" name="filesToUpload[]" multiple> 
    <input type="submit" name="submit"/>Submit 
</form> 

Чтобы запустить этот пример, ваши файлы должны выглядеть

enter image description here

Вы можете запуск встроенный веб-сервер PHP с:

$ php -S localhost:8000 

Затем, перейдя к примеру http://localhost:8000/sandbox.php.


Важное примечание: Приведенный выше пример не производит никакой проверки. Вам нужно будет подтвердить, что все загруженные файлы безопасны.

Смежные вопросы