Загрузка нескольких файлов в php - PullRequest
106 голосов
/ 24 апреля 2010

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

Примечание: Файлы могут быть любого типа ...

Ответы [ 13 ]

226 голосов
/ 17 августа 2012

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

  • Входное имя должно быть определено как массив, т.е. name="inputName[]"
  • Элемент ввода должен иметь multiple="multiple" или просто multiple
  • В вашем файле PHP используйте синтаксис "$_FILES['inputName']['param'][index]"
  • Обязательно ищите пустых имен файлов и путей , массив может содержать пустых строк . Используйте array_filter() до подсчета.

Вот простой и грязный пример (показывает только соответствующий код)

HTML:

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

PHP:

//$files = array_filter($_FILES['upload']['name']); //something like that to be used before processing files.

// Count # of uploaded files in array
$total = count($_FILES['upload']['name']);

// Loop through each file
for( $i=0 ; $i < $total ; $i++ ) {

  //Get the temp file path
  $tmpFilePath = $_FILES['upload']['tmp_name'][$i];

  //Make sure we have a file path
  if ($tmpFilePath != ""){
    //Setup our new file path
    $newFilePath = "./uploadFiles/" . $_FILES['upload']['name'][$i];

    //Upload the file into the temp dir
    if(move_uploaded_file($tmpFilePath, $newFilePath)) {

      //Handle other code here

    }
  }
}

Надеюсь, это поможет!

36 голосов
/ 18 декабря 2011

Несколько файлов могут быть выбраны и затем загружены с помощью
<input type='file' name='file[]' multiple>
Пример php-скрипта, который выполняет загрузку:

<html>
<title>Upload</title>
<?php
    session_start();
    $target=$_POST['directory'];
        if($target[strlen($target)-1]!='/')
                $target=$target.'/';
            $count=0;
            foreach ($_FILES['file']['name'] as $filename) 
            {
                $temp=$target;
                $tmp=$_FILES['file']['tmp_name'][$count];
                $count=$count + 1;
                $temp=$temp.basename($filename);
                move_uploaded_file($tmp,$temp);
                $temp='';
                $tmp='';
            }
    header("location:../../views/upload.php");
?>
</html>

Выбранные файлы принимаются в виде массива с

$_FILES['file']['name'][0] сохранение имени первого файла.
$_FILES['file']['name'][1] сохранение имени второго файла.
и т. д.

6 голосов
/ 01 октября 2012

HTML

  1. создать div с id='dvFile';

  2. создать button;

  3. onclick этой кнопки, вызывающей функцию add_more()

JavaScript

function  add_more() {
  var txt = "<br><input type=\"file\" name=\"item_file[]\">";
  document.getElementById("dvFile").innerHTML += txt;
}

PHP

if(count($_FILES["item_file"]['name'])>0)
 { 
//check if any file uploaded
 $GLOBALS['msg'] = ""; //initiate the global message
  for($j=0; $j < count($_FILES["item_file"]['name']); $j++)
 { //loop the uploaded file array
   $filen = $_FILES["item_file"]['name']["$j"]; //file name
   $path = 'uploads/'.$filen; //generate the destination path
   if(move_uploaded_file($_FILES["item_file"]['tmp_name']["$j"],$path)) 
{
   //upload the file
    $GLOBALS['msg'] .= "File# ".($j+1)." ($filen) uploaded successfully<br>";
    //Success message
   }
  }
 }
 else {
  $GLOBALS['msg'] = "No files found to upload"; //No file upload message 
}

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

4 голосов
/ 27 октября 2012

Простым является то, что сначала просто посчитайте массив файлов, а затем в цикле while вы можете легко сделать это как

$count = count($_FILES{'item_file']['name']);

теперь вы правильно указали общее количество файлов.

В цикле while сделайте так:

$i = 0;
while($i<$count)
{
    Upload one by one like we do normally
    $i++;
}
4 голосов
/ 05 февраля 2011
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php
$max_no_img=4; // Maximum number of images value to be set here

echo "<form method=post action='' enctype='multipart/form-data'>";
echo "<table border='0' width='400' cellspacing='0' cellpadding='0' align=center>";
for($i=1; $i<=$max_no_img; $i++){
echo "<tr><td>Images $i</td><td>
<input type=file name='images[]' class='bginput'></td></tr>";
}

echo "<tr><td colspan=2 align=center><input type=submit value='Add Image'></td></tr>";
echo "</form> </table>";
while(list($key,$value) = each($_FILES['images']['name']))
{
    //echo $key;
    //echo "<br>";
    //echo $value;
    //echo "<br>";
if(!empty($value)){   // this will check if any blank field is entered
$filename =rand(1,100000).$value;    // filename stores the value

$filename=str_replace(" ","_",$filename);// Add _ inplace of blank space in file name, you can remove this line

$add = "upload/$filename";   // upload directory path is set
//echo $_FILES['images']['type'][$key];     // uncomment this line if you want to display the file type
//echo "<br>";                             // Display a line break
copy($_FILES['images']['tmp_name'][$key], $add); 
echo $add;
    //  upload the file to the server
chmod("$add",0777);                 // set permission to the file.
}
}
?>
</body>
</html>
4 голосов
/ 24 апреля 2010

Это ничем не отличается от загрузки одного файла - $_FILES - это массив, содержащий все загруженные файлы.

В руководстве по PHP есть глава: Загрузка нескольких файлов

Если вы хотите разрешить загрузку нескольких файлов с легким выбором на стороне пользователя (выбор нескольких файлов одновременно вместо заполнения полей загрузки), взгляните на SWFUpload . Он работает не так, как обычная форма загрузки файлов, и для его работы требуется Flash. SWFUpload устарел вместе с Flash. Проверьте другие, более новые ответы для теперь правильного подхода.

3 голосов
/ 23 мая 2014

Вот функция, которую я написал, которая возвращает более понятный $_FILES массив.

function getMultiple_FILES() {
    $_FILE = array();
    foreach($_FILES as $name => $file) {
        foreach($file as $property => $keys) {
            foreach($keys as $key => $value) {
                $_FILE[$name][$key][$property] = $value;
            }
        }
    }
    return $_FILE;
}
2 голосов
/ 14 августа 2017

этот простой скрипт работал для меня.

<?php

foreach($_FILES as $file){
  //echo $file['name']; 
  echo $file['tmp_name'].'</br>'; 
  move_uploaded_file($file['tmp_name'], "./uploads/".$file["name"]);
}

?>
1 голос
/ 14 ноября 2014

Только что наткнулся на следующее решение:

http://www.mydailyhacks.org/2014/11/05/php-multifile-uploader-for-php-5-4-5-5/

это готовый PHP-скрипт для загрузки нескольких файлов с формой, в которую можно добавить несколько входов, и индикатор выполнения AJAX. Должно работать сразу после распаковки на сервере ...

1 голос
/ 17 мая 2014

Я запускаю цикл foreach с элементом error, похоже на

 foreach($_FILES['userfile']['error'] as $k=>$v)
 {
    $uploadfile = 'uploads/'. basename($_FILES['userfile']['name'][$k]);
    if (move_uploaded_file($_FILES['userfile']['tmp_name'][$k], $uploadfile)) 
    {
        echo "File : ", $_FILES['userfile']['name'][$k] ," is valid, and was                      successfully uploaded.\n";
    }

    else 
    {
        echo "Possible file : ", $_FILES['userfile']['name'][$k], " upload attack!\n";
    }   

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