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

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

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

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

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

Ответ 1

Это возможно в 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 после выбора двух элементов в диалоговом окне файла:

chrome multiple file select

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

submitting multiple files to PHP

Это всего лишь эскиз полностью работающего ответа. См. Руководство 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 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>

Ответ 4

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

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


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

http://swfupload.org/

Ответ 5

в первую очередь вы должны сделать такую ​​форму:

<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/>';
}
?>

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

Ответ 6

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

Ответ 8

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

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

Поле базы данных

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

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

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

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

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 заканчивается здесь

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

Ответ 9

У меня этот бит более простой

<?php

    $image1=$_FILES["file"] ["name"][0];
    $image2=$_FILES["file"] ["name"][1];
    $image3=$_FILES["file"] ["name"][2];

    $temp1=$_FILES["file"] ["tmp_name"][0];
    $temp2=$_FILES["file"] ["tmp_name"][1];
    $temp3=$_FILES["file"] ["tmp_name"][2];

    $image4=$_FILES["file_ot"] ["name"][0];
    $image5=$_FILES["file_ot"] ["name"][1];


    $temp4=$_FILES["file_ot"] ["tmp_name"][0];
    $temp5=$_FILES["file_ot"] ["tmp_name"][1];




    $query="INSERT INTO `vendordata`( `details`, `phone`, `email`, `driverpic`, `licensepic`, `adharcardpic`, `pancard`, `policeverification`)
    VALUES ('$details','$phone','$email','$image1','$image2','$image3','$image4','$image5')";



    move_uploaded_file($temp1,'uploads/'.$image1);
    move_uploaded_file($temp2,'uploads/'.$image2);
    move_uploaded_file($temp3,'uploads/'.$image3);
    move_uploaded_file($temp4,'uploads/'.$image4);
    move_uploaded_file($temp5,'uploads/'.$image5);
    $run=$db->query($query);
    if ($run) {
      echo "inserted";
    }
    else {
       echo("Error description: " . mysqli_error($db));
    }
    ?>

Ответ 10

<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>

Использование цикла 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];

      /* 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 Loop

<?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}.";                               
      }                 

    }               
  }
?>