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


У меня есть опыт делать это с одной загрузки файлов с помощью <input type="file">. Тем не менее, у меня возникли проблемы с загрузкой более одного за раз.

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

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

кто-нибудь знает, как это сделать? Спасибо!

10 130

10 ответов:

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

<!doctype html>
<html>
    <head>
        <title>Test</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>
                            Name: <?= $myFile["name"][$i] ?><br>
                            Temporary file: <?= $myFile["tmp_name"][$i] ?><br>
                            Type: <?= $myFile["type"][$i] ?><br>
                            Size: <?= $myFile["size"][$i] ?><br>
                            Error: <?= $myFile["error"][$i] ?><br>
                        </p>
                    <?php
                }
            }
        ?>
    </body>
</html>

вот как это выглядит в Chrome после выбора 2 элементов в диалоговом окне файла:

chrome multiple file select

и вот как это выглядит после нажатия на кнопку "Загрузить".

submitting multiple files to PHP

Это всего лишь набросок полностью рабочего ответа. Смотрите PHP руководство: обработка загрузки файлов для получения дополнительной информации о правильной, безопасной обработки файла отправляет в PHP.

есть несколько вещей, которые вам нужно сделать, чтобы создать несколько загрузки файлов, его довольно простой на самом деле. Вам не нужно использовать 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() для подсчета количества файлов, которые были выбраны. Widdit Гудлак!

полное решение в Firefox 5:

<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 "No. files uploaded : ".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); 

 // generate a random new file name to avoid name conflict
 $fPath = md5(rand() * time()) . ".$ext";

 echo "File paths : ".$_FILES['infile']['tmp_name'][$i]."<br>";
 $result = move_uploaded_file($_FILES['infile']['tmp_name'][$i], $uploadDir . $fPath);

 if (strlen($ext) > 0){
  echo "Uploaded ". $fPath ." succefully. <br>";
 }
}
echo "Upload complete.<br>";
?>

</body>
</html>

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

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


обновление: Существует один способ использовать одну кнопку "Обзор", которая использует flash. Я никогда лично не использовал это, но я прочитал довольно много об этом. Я думаю, что это ваш лучший выстрел.

http://swfupload.org/

в первом вы должны сделать форму, как это:

<form method="post" enctype="multipart/form-data" >
   <input type="file" name="file[]" multiple id="file"/>
   <input type="submit" name="ok"  />
</form> 

Это верно . теперь добавьте этот код под код формы или на любой странице вам нравится

<?php
if(isset($_POST['ok']))
   foreach ($_FILES['file']['name'] as $filename) {
    echo $filename.'<br/>';
}
?>

это легко... закончить

Если вы используете несколько полей ввода, вы можете установить name="file[]" (или любое другое имя). Это поместит их в массив при загрузке ($_FILES['file'] = array ({file_array},{file_array]..))

есть еще один Флэш-загрузчик, который является бесплатным,Uploadify.

Хольгер - Поисковая Система Amidalla

<form action="" method="POST" enctype="multipart/form-data">
  Select image to upload:
  <input type="file"   name="file[]" multiple/>
  <input type="submit" name="submit" value="Upload Image" />
</form>

использование для цикла

<?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];

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

      if (move_uploaded_file($file_tmp, $file_target)) {                        
        echo "{$file_name} has been uploaded. <br />";                      
      } else {                      
        echo "Sorry, there was an error uploading {$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];

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

      if (move_uploaded_file($file_tmp, $file_target)) {                        
        echo "{$file_name} has been uploaded. <br />";                      
      } else {                      
        echo "Sorry, there was an error uploading {$file_name}.";                               
      }                 

    }               
  }
?>

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

$dir-каталог, в который вы хотите сохранить изображение $fields-это имя поля, которое вы хотите сохранить в базе данных

поле базы данных должно быть в формате массива образец если у вас есть база данных imagestore и поля имя, как id, имя, адрес, то вам нужно разместить данные, как

$fields=array("id"=$_POST['idfieldname'], "name"=$_POST['namefield'],"address"=$_POST['addressfield']);

а затем передать это поле в функцию $fields

$таблица-имя таблицы, в которой вы хотите хранить данные..

function multipleImageUpload($arrayimage,$dir,$fields,$table)
{
    //extracting extension of uploaded file
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $arrayimage["name"]);
    $extension = end($temp);

    //validating image
    if ((($arrayimage["type"] == "image/gif")
    || ($arrayimage["type"] == "image/jpeg")
    || ($arrayimage["type"] == "image/jpg")
    || ($arrayimage["type"] == "image/pjpeg")
    || ($arrayimage["type"] == "image/x-png")
    || ($arrayimage["type"] == "image/png"))

    //check image size

    && ($arrayimage["size"] < 20000000)

    //check iamge extension in above created extension array
    && in_array($extension, $allowedExts)) 
    {
        if ($arrayimage["error"] > 0) 
        {
            echo "Error: " . $arrayimage["error"] . "<br>";
        } 
        else 
        {
            echo "Upload: " . $arrayimage["name"] . "<br>";
            echo "Type: " . $arrayimage["type"] . "<br>";
            echo "Size: " . ($arrayimage["size"] / 1024) . " kB<br>";
            echo "Stored in: ".$arrayimage['tmp_name']."<br>";

            //check if file is exist in folder of not
            if (file_exists($dir."/".$arrayimage["name"])) 
            {
                echo $arrayimage['name'] . " already exists. ";
            } 
            else 
            {
                //extracting database fields and value
                foreach($fields as $key=>$val)
                {
                    $f[]=$key;
                    $v[]=$val;
                    $fi=implode(",",$f);
                    $value=implode("','",$v);
                }
                //dynamic sql for inserting data into any table
                $sql="INSERT INTO " . $table ."(".$fi.") VALUES ('".$value."')";
                //echo $sql;
                $imginsquery=mysql_query($sql);
                move_uploaded_file($arrayimage["tmp_name"],$dir."/".$arrayimage['name']);
                echo "<br> Stored in: " .$dir ."/ Folder <br>";

            }
        }
    } 
    //if file not match with extension
    else 
    {
        echo "Invalid file";
    }
}
//function imageUpload ends here
}

/ / imageFunctions класс заканчивается здесь

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

частичный ответ: pear HTTP_UPLOAD может быть полезным http://pear.php.net/manual/en/package.http.http-upload.examples.php

есть полный пример для нескольких файлов