Web

Как я могу выбрать и загрузить несколько файлов с помощью HTML и PHP, используя HTTP POST?

У меня есть опыт загрузки одного файла с помощью <input type="file">. Однако у меня возникают проблемы с загрузкой более одного файла за раз. Например, я хочу выбрать серию изображений и загрузить их на сервер все сразу. Было бы здорово использовать элемент управления вводом одного файла, если это возможно. Кто-нибудь знает, как этого добиться?

Ответ 1

Это возможно в HTML5. Пример (PHP 5.4):

<!doctype html>

<html>

    <head>

        <title>Тест</title>

    </head>

    <body>

        <form method="post" enctype="multipart/form-data">

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

            <input type="submit" value="Upload">

        </form>

        <?php

            if (isset($_FILES['my_file'])) {

                $myFile = $_FILES['my_file'];

                $fileCount = count($myFile["name"]);

                for ($i = 0; $i < $fileCount; $i++) {

                    ?>

                        <p>File #<?= $i+1 ?>:</p>

                        <p>

                            Имя: <?= $myFile["name"][$i] ?><br>

                            Временный файл: <?= $myFile["tmp_name"][$i] ?><br>

                            Тип: <?= $myFile["type"][$i] ?><br>

                            Размер: <?= $myFile["size"][$i] ?><br>

                            Ошибка: <?= $myFile["error"][$i] ?><br>

                        </p>

                    <?php

                }

            }

        ?>

    </body>

</html>

Это лишь набросок полностью рабочего ответа. Смотрите Руководство по PHP:

Обработка загрузки файлов для получения дополнительной информации о правильной и безопасной обработке загрузки файлов в PHP.

Ответ 2

Есть несколько вещей, которые необходимо сделать, чтобы создать загрузку нескольких файлов. На самом деле это довольно просто. Вам не нужно использовать Java, Ajax, Flash. Просто создайте обычную форму загрузки файлов, начиная с:

<form enctype="multipart/form-data" action="post_upload.php" method="POST">

И тогда:

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

НЕ забывайте про скобки! В файле post_upload.php попробуйте сделать следующее:

<?php print_r($_FILES['file']['tmp_name']); ?>

Обратите внимание, что вы получите массив с данными tmp_name, что будет означать, что вы можете обращаться к каждому файлу с помощью третьей пары скобок с примером файла 'number':

$_FILES['file']['tmp_name'][0]

Вы можете использовать php count() для подсчета количества файлов, которые были выбраны. 

Ответ 3

Полное решение для Firefox:

<html>

<head>

</head>

<body>

 <form name="uploader" id="uploader" action="multifile.php" method="POST" enctype="multipart/form-data" >

  <input id="infile" name="infile[]" type="file" onBlur="submit();" multiple="true" ></input> 

 </form>

 

<?php

echo "Количество файлов для загрузки : ".count($_FILES['infile']['name'])."<br>"; 

$uploadDir = "images/";

for ($i = 0; $i < count($_FILES['infile']['name']); $i++) {

 echo "File names : ".$_FILES['infile']['name'][$i]."<br>";

 $ext = substr(strrchr($_FILES['infile']['name'][$i], "."), 1); 

// генерируем случайное новое имя файла, чтобы избежать конфликта имен

 $fPath = md5(rand() * time()) . ".$ext";

 echo "Путь к файлу : ".$_FILES['infile']['tmp_name'][$i]."<br>";

 $result = move_uploaded_file($_FILES['infile']['tmp_name'][$i], $uploadDir . $fPath);

 if (strlen($ext) > 0){

  echo "Загрузка произведена". $fPath ." успешно. <br>";

 }

}

echo "Загрузка завершена.<br>";

?>

</body>

</html>

Ответ 4

Если вы хотите выбрать несколько файлов из диалогового окна выбора файлов, которое отображается при выборе пункта browse, то вам в основном не повезло. Вам нужно будет использовать Java-апплет или что-то подобное (я думаю, что есть один вариант, который использует небольшой flash-файл, я обновлю, если найду его). В настоящее время ввод одного файла позволяет выбрать только один файл. Если вы говорите об использовании ввода нескольких файлов, то не должно быть большой разницы с использованием одного. Существует один метод использования одной кнопки «browse», который использует flash. Я никогда не использовал его лично, но читал о нем достаточно много. Думаю, это лучший вариант.

http://swfupload.org/

Ответ 5

<form action="" method="POST" enctype="multipart/form-data">

  Выберите изображение для загрузки:

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

  <input type="submit" name="submit" value="Upload Image" />

</form>

 

Использование цикла FOR:

<?php    

  $file_dir  = "uploads";    

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

    for ($x = 0; $x < count($_FILES['file']['name']); $x++) {               

      $file_name   = $_FILES['file']['name'][$x];

      $file_tmp    = $_FILES['file']['tmp_name'][$x];

      /* местоположение для сохранения файла */

      $file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR = / or \ */

      if (move_uploaded_file($file_tmp, $file_target)) {                        

        echo "{$file_name} был загружен. <br />";                      

      } else {                      

        echo "Ошибка, файл не был загружен {$file_name}.";                               

      }                 

    }               

  }    

?>

 

Использование цикла FOREACH:

 

<?php

  $file_dir  = "uploads";    

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

    foreach ($_FILES['file']['name'] as $key => $value) {                   

      $file_name   = $_FILES['file']['name'][$key];

      $file_tmp    = $_FILES['file']['tmp_name'][$key];

      /* местоположение для сохранения файла */

      $file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR = / or \ */

      if (move_uploaded_file($file_tmp, $file_target)) {                        

        echo "{$file_name} был загружен. <br />";                      

      } else {                      

        echo "Ошибка, файл не был загружен {$file_name}.";                               

      }                 

    }               

  }

?>

Схожие статьи

Web

Перегрузка функций PHP

Web

Как получить миниатюру видеоролика YouTube используя YouTube API?

Что такое визуальная концепция сайта: этапы разработки
Web

Что такое визуальная концепция сайта: этапы разработки

Уязвимости Apache HTTP Server: как их обнаружить и устранить?
Web

Уязвимости Apache HTTP Server: как их обнаружить и устранить?