2012-01-06 5 views
1

Я в настоящее время загрузки одного файла успешно с помощью следующей формы:PHP Uploading: загрузка нескольких файлов?

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

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

+2

http://php.net/manual/en/features.file-upload.multiple.php – mario

ответ

7

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

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

или

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

Помните - атрибут name определяет, как вы будете определить, что поле на сервере , и если вы используете одно и то же имя несколько раз, PHP будет перезаписывать предыдущие копии с последним, когда он анализирует представленные данные. Обозначение массива ([]) сообщает PHP, что вы INTENDED должны иметь несколько полей с тем же именем и что каждая найденная им копия должна быть добавлена ​​в массив, а не перезаписана.

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

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

$_FILES = array(
    'fieldname' => array(
     'name' => array(
      0 => 'first file', 
      1 => 'second file', 
      etc... 
     ) 
    ) 
) 
+0

Отлично! Это было именно то, что мне нужно. Я ценю это :). – SB2055

4

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

<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

PHP файл данных идет в $ _FILES, а не $ _POST. И ссылаясь на загруженные файлы, значительно отличается (структурно) для версии массива, чем для одноименных файлов. Это будет $ _FILES ['file'] ['name'] [0] –

+0

обновлено для '$ _FILES' –

+0

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

0

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

+0

Большое спасибо Kemal! – SB2055

1

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

<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

ПОЦЕЛУЙ кодекса с некоторыми пояснениями:

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

Массив $ _FILES представляет собой трехмерный массив, встроенный в PHP, и здесь хранится вся информация о загруженном файле.

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

Итак, если ваш ВХОДНОЙ тег выглядит следующим образом:

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

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

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

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

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

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

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

Каждое последующее имя файла будет находиться в $ _FILES ['InpFile'] ['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"); 

В заявлении Еогеасп ниже $ 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"> 

Put это 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"; 
    } 
} 
?> 
Смежные вопросы