Як я можу вибрати та завантажити декілька файлів за допомогою HTML та PHP, використовуючи HTTP POST?


155

Я маю досвід робити це із завантаженням одного файлу за допомогою <input type="file">. Однак у мене виникають проблеми із завантаженням декількох.

Наприклад, я хотів би мати можливість вибрати серію зображень, а потім завантажити їх на сервер, і все відразу.

Було б чудово використовувати єдиний елемент керування введенням файлів, якщо це можливо.

Хтось знає, як це досягти? Дякую!


2
Ви хочете сказати, що виберіть більше одного файлу в діалоговому вікні вибору файлів або використовуєте кілька входів файлів?
MitMaro

Привіт, Ви можете завантажити архівний файл (zip, rar, tar, ...)?
sourcerebels

Відповіді:


196

Це можливо в 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 елементів у діалоговому вікні файлу:

вибір декількох хромованих файлів

І ось як це виглядає після натискання кнопки «Завантажити».

подання декількох файлів на PHP

Це лише ескіз повноцінної відповіді. Див. Посібник із PHP: Обробка завантажень файлів для отримання додаткової інформації про правильне та безпечне управління завантаженнями файлів у PHP.


8
чи проходить це перевірку w3c, чи має бути multiple="multiple"?
vol7ron

10
Я вважаю, що це дійсно: thinkresults.com/html5-boolean-attributes . Він передає валідатор w3c, якщо ви додасте <! Doctype html>.
Марк Е. Хааз

2
так, це, ймовірно, підтверджує HTML, але не дає XHTML. Незважаючи на те, що я все ще люблю використовувати XHTML, я думаю, що люди радять залишатися подалі від цього в наші дні.
vol7ron

11
Він не працює без додавання властивості імені (наприклад name="file[]"). Я спробував відредагувати відповідь , але її відхилили.
Мішель Ейрес

1
Дякую @MichelAyres, я оновив свою відповідь. Коли я оригінально писав це, я звертався лише до HTML частини проблеми b / c, були й інші відповіді, які пояснювали частину PHP. З часом це стало популярною відповіддю, тому я зараз розширився, щоб охопити як HTML, так і PHP.
Марк Е. Хааз

94

Є кілька речей, які вам потрібно зробити, щоб створити кілька завантажених файлів, насправді це досить просто. Вам не потрібно використовувати 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, що означає, що ви можете отримати доступ до кожного файлу з третьою парою дужок із прикладом "номер" файлу:

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

Ви можете використовувати php count () для підрахунку кількості вибраних файлів. Goodluck widdit!


5
Дякую за пораду! це врятувало мені стільки часу +1
BPm

Це працює дуже добре ... але у мене виникають проблеми з завантаженням цього способу в Internet Explorer (v8). Я думаю, що IE не підтримує завантаження таким чином.
Тарік М Насім

4
Або ви можете переглядати файли із foreachзаявою, не знаючи кількості завантажених файлів ...
ygesher

Зауважте, якщо ви використовуєте ключ свого імені у своєму html, наприклад, name = "файл [3]", тоді вам потрібно отримати доступ до значення через $ _FILES ['файл'] ['tmp_name'] [3], якщо це не очевидно.
MyStream

8

Повне рішення у 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>

Код вирізаний. Ось що йде над цим: <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>
Thaps

3
Він не працював в IE8, але тоді просто використовуйте справжній браузер.
Тапс

5

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

Якщо ви говорите про використання декількох файлових входів, то від використання одного не повинно бути великої різниці. Опублікуйте якийсь код, і я спробую допомогти далі.


Оновлення: Існує один метод використання однієї кнопки "перегляду", яка використовує спалах. Я ніколи особисто не використовував це, але я прочитав неабияку кількість про це. Я думаю, що це ваш найкращий знімок.

http://swfupload.org/


1
Я додав посилання на декілька завантажувачів на основі флеш.
MitMaro

Я використовував swwupload fwiw - це болить в деяких випадках, але не дуже важко працювати.
Meep3D

@Barsoom правильний. Речі стали набагато кращими при декількох завантаженнях файлів за останні пару років. : D
MitMaro

4

спочатку слід скласти форму такою:

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

це легко ... закінчити


1

Якщо ви використовуєте кілька полів введення, ви можете встановити name = "файл []" (або будь-яке інше ім'я). Це додасть їх до масиву, коли ви завантажуєте їх ( $_FILES['file'] = array ({file_array},{file_array]..))


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

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

    }               
  }
?>

0

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

$ dir - це каталог, у якому ви хочете зберегти зображення $ поля - це ім'я поля, яке ви хочете зберегти в базі даних

Поле бази даних повинно бути прикладом формату масиву, якщо у вас є сховище зображень бази даних та такі поля, як id, ім'я, адреса, тоді вам потрібно розміщувати дані, наприклад

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

а потім передайте це поле у ​​функції $ поля

$ 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

ви можете спробувати цей код для вставки декількох зображень з його розширенням. Ця функція створена для перевірки файлів зображень. Ви можете замінити список розширень для пертикулярних файлів у коді


Привіт усім, я використовую файловий вклад, щоб приєднати документи до автогенерованої електронної пошти. Я можу приєднати декілька документів на ходу, однак, я хотів би долучити декілька документів із різних директорій. В даний час, якщо я це роблю, мій вибраний на даний момент документ замінюється новим обраним мною документом. Будь ласка, як мені це зробити. Дякую
Кунбі

-1

часткова відповідь: груша HTTP_UPLOAD може бути корисною http://pear.php.net/manual/en/package.http.http-upload.examples.php

є повний приклад для декількох файлів


1
Ви можете використовувати пакет PEAR, але це завдання є досить тривіальним, і якщо вам не потрібні додаткові функції, які надає пакунок (інтернаціоналізовані повідомлення про помилки, перевірка вантажу тощо), я б рекомендував використовувати нативні функції PHP. Але це лише моя думка. :)
MitMaro

Я згоден з вами, тому я написав "часткову відповідь". Але я також
докладаю всіх зусиль,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.