Загрузка PHP: загрузка нескольких файлов? - PullRequest
1 голос
/ 06 января 2012

В настоящее время я успешно загружаю один файл со следующей формой:

<html>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 

<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

И со следующим скриптом:

<?php
error_reporting(E_ALL);



    if (($_FILES["file"]["size"] < 20000))
      {
      if ($_FILES["file"]["error"] > 0)
        {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
        }
      else
        {
        echo "Upload: " . $_FILES["file"]["name"] . "<br />";
        echo "Type: " . $_FILES["file"]["type"] . "<br />";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";


        $moved = move_uploaded_file($_FILES["file"]["tmp_name"], "C:/inetpub/wwwroot/PHP_Ramp/upload/" . $_FILES["file"]["name"]);

        if ($moved) {
            echo "Move: Success <br/>";
        }
        else {
            echo "Move Failed <br/>";
        }


          echo "Stored in: " . "C:/inetpub/wwwroot/PHP_Ramp/upload/" . $_FILES["file"]["name"];
          }
        }

    else
      {
      echo "Invalid file";
      }
    ?>

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

Я изменил форму следующим образом (чтобы включить три входа):

<html>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" /> 
<input type="file" name="file" id="file" />
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>

Но я не уверен, как изменить php для обработки всех трех файлов. Я знаю, что мне нужно перебрать _FILES, но все, что я пробовал, не работает. Любые указатели будут оценены.

Ответы [ 5 ]

7 голосов
/ 06 января 2012

Каждый элемент файла должен иметь уникальное имя или использовать сокращение массива PHP:

<input type="file" name="file1" />
<input type="file" name="file2" />

или

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

Помните - атрибут name определяет, как вы будете идентифицировать это поле на сервере, и если вы используете одно и то же имя несколько раз, PHP перезапишет предыдущие копии самой последней, когда он анализирует представленные данные. Обозначение массива ([]) говорит PHP, что вы НАМЕРЕНЫ иметь несколько полей с одним и тем же именем и что каждая найденная копия должна быть добавлена ​​в массив, а не перезаписана.

Для версии с уникальным именем вы будете обрабатывать каждый файл, как и сейчас, одним файлом.

Для версии массива PHP имеет глупость дизайна, которая требует немного другой обработки. Вы получаете массив $ _FILES, который выглядит как

$_FILES = array(
    'fieldname' => array(
         'name' => array(
             0 => 'first file',
             1 => 'second file',
             etc...
         )
    )
)
4 голосов
/ 06 января 2012

Вам нужно изменить

<input name="file" />

до

<input name="file[]" />

Чтобы превратить их в массив.

Затем в вашем сценарии вы ссылаетесь на них как на

$_FILES['file']['name'][0]; // first file
$_FILES['file']['name'][1]; // second file

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


В качестве альтернативы, вы можете дать им разные имена:

<input name="firstfile" />
<input name="secondfile" />

Тогда в вашем скрипте:

$_FILES['firstfile']; // first file
$_FILES['secondfile']; // second file
1 голос
/ 08 января 2013

Вы можете выбрать несколько файлов в одном входе, как это ..

<input type="file" name="pic[]" id="pic" accept="image/*" multiple="multiple"/>

Это поле ввода может принимать несколько файлов, нажав клавишу управления. Теперь вы можете получить к ним доступ в php, как это

$_FILES['file']['name'][0]; // first file
$_FILES['file']['name'][1]; // second file
0 голосов
/ 20 февраля 2013

Код KISS с некоторыми пояснениями:

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

Массив $ _FILES - это трехмерный массив, встроенный в PHP, в котором хранится вся информация о загруженном файле.

Для каждой части 'name =' тега HTML INPUT будет только ОДИН элемент.

Так что, если ваш тэг INPUT выглядит так:

<INPUT name="InpFile[]" type="file" />

В массиве $ _FILES будет один верхний элемент массива с именем 'InpFile'.

Также обратите внимание на [] после InpFile ....., который сообщает PHP, что каждый раз, когда вы используете входной тег с тем же именем, он добавляет его в тот же самый верхний элемент массива $ _FILES.

В этом одном элементе есть 5 других элементов массива с именами: «name», «type», «tmp_name», «error» и «size».

И каждый из этих элементов массива будет содержать данные для каждого загружаемого файла.

Ваше первое загруженное имя файла будет в $ _FILES ['InpFile'] ['name'] ['0']

И другая информация о вашем первом загруженном файле также будет в массиве таким же образом, например, размер первого файла будет в $ _FILES ['InpFile'] ['size'] ['0']

Каждое последующее имя файла будет находиться в $ _FILES ['InpFile'] ['name'] [1], $ _FILES ['InpFile'] ['name'] [2] .... и т. Д.

После загрузки каждый файл будет иметь случайное временное имя в элементе $ _FILES ['InpFile'] ['tmp_name'] [0 ... n], который используется для первой загрузки файлов. во временную зону.

ТАК, после загрузки вам нужно переместить файлы из временной области туда, куда вы хотите.

Это делается с помощью этого утверждения:

move_uploaded_file($_FILES['InpFile']['tmp_name'][$Key],  
    $_FILES['InpFile']['name'][$Key] ) 
        or die("Move from Temp area failed");

В приведенном ниже операторе foreach $ Key и $ Name присутствуют только для того, чтобы $ Key получал назначенные увеличивающиеся числа для каждой итерации ... т.е. 0, 1, 2 ..... и т. Д., И затем вы можете использовать $ Key для ссылки на имя, tmp_name и т. Д. Каждого файла в массиве.

Этот код позволяет вам делать все это на одной странице, поскольку форма фактически вызывает себя (action = "") для публикации. Таким образом, при первой загрузке страницы вы получите сообщение об ошибке в коде php, поскольку $ _FILES еще не установлен ...... поэтому весь код находится в операторе If: If ($ _FILES).

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

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

    <FORM action="" method="post" enctype="multipart/form-data">
    <P align="center"><B>Choose Files</B><BR>
      <BR>
      File One: 
      <INPUT name="InpFile[]" type="file" />
      <BR>
      <BR>
      File Two: 
      <INPUT name="InpFile[]" type="file" />
      <BR>
    </P>
    <P align="center"><BR>
      <INPUT type="submit" name="submit" value="UpLoad">
    </P>
 </FORM>
  <H3 align="center">&nbsp;</H3>
  <H3 align="center">Status:</H3>
  <P align="center">&nbsp;</P>
  <P align="center">

Поместите этот код PHP прямо здесь на той же странице:

<?php
If ($_FILES) {
    foreach ($_FILES ['InpFile']['name'] as $Key => $Name) {
        move_uploaded_file(
          $_FILES['InpFile']['tmp_name'][$Key], 
          $_FILES['InpFile']['name'][$Key] 
        ) or die("Move from Temp area Failed");
        $EFileName = $_FILES['InpFile']['name'][$Key];
        echo "<P>$EFileName: Uploaded";
    }
}
?>
0 голосов
/ 06 января 2012

Вам необходимо изменить значение атрибута name на стороне HTML на file[], а затем в PHP просто выполнить итерацию по $_FILES['files'] и обработать каждый элемент, как обычно, с одним файлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...