Como posso selecionar e enviar vários arquivos com HTML e PHP, usando o HTTP POST?

Tenho experiência a fazer isto com uploads de ficheiros individuais usando {[[0]}. No entanto, estou a ter dificuldade em fazer o upload de mais de um de cada vez.

por exemplo, eu gostaria de ser capaz de selecionar uma série de imagens, em seguida, enviá-las para o servidor, tudo de uma vez.

seria ótimo usar um único controle de entrada de arquivos, se possível.

Alguém sabe como fazer isto? Obrigado!

Author: stalepretzel, 2009-07-24

10 answers

Isto é possível emHTML5 . Exemplo (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>

Aqui está o que parece no Chrome depois de seleccionar 2 itens na janela de ficheiros:

chrome multiple file select

E isto é o que parece depois de carregar no botão "Carregar".

submitting multiple files to PHP

Isto é apenas um esboço de uma resposta totalmente funcional. Ver Manual do PHP: manipulação das cargas uploads de Ficheiros para mais informações sobre o tratamento seguro e adequado das cargas uploads de ficheiros no PHP.
 171
Author: Mark E. Haase, 2015-03-12 01:24:26

Existem algumas coisas que você precisa fazer para criar um upload de arquivos múltiplos, é bastante básico na verdade. Não precisas de usar Java, Ajax, Flash. Basta compilar um formulário de envio de ficheiros normal a começar por:

<form enctype="multipart/form-data" action="post_upload.php" method="POST">

Então a chave para o sucesso;

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

Não te esqueças dos suportes! No post_upload.PHP tente o seguinte:
<?php print_r($_FILES['file']['tmp_name']); ?>

Repare que tem uma lista com os dados do tmp_name, o que significa que pode aceder a cada ficheiro com um terceiro par de parêntesis com o exemplo do ficheiro 'número':

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

Você pode usar o PHP count () para contar o número de arquivos que foi selecionado. Goodluck widdit!

 91
Author: Epoxys, 2015-04-21 00:39:55

Solução completa no 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>
 7
Author: Thaps, 2013-11-06 01:34:07

Se quiser seleccionar vários ficheiros da janela de selecção de ficheiros que mostra quando selecciona navegar, então está praticamente sem sorte. Você vai precisar usar um applet Java ou algo semelhante (eu acho que há um que usa um pequeno arquivo flash, eu vou atualizar se eu encontrá-lo). De momento, uma entrada de um único ficheiro só permite a selecção de um único ficheiro.

Se está a falar em usar várias entradas de ficheiros, então não deve haver muita diferença em usar uma. Postar algum código e eu vou tentar ajudar mais.


Actualizar: Existe um método para usar um único botão 'Navegar' que usa flash. Nunca usei isto pessoalmente, mas li muito sobre isso. Acho que é a tua melhor hipótese.

Http://swfupload.org/

 5
Author: MitMaro, 2009-07-24 01:25:28

Na primeira, você deve fazer uma forma como esta:

<form method="post" enctype="multipart/form-data" >
   <input type="file" name="file[]" multiple id="file"/>
   <input type="submit" name="ok"  />
</form> 
Isso mesmo . Agora adicione este código sob o seu código de formulário ou em qualquer página que você goste
<?php
if(isset($_POST['ok']))
   foreach ($_FILES['file']['name'] as $filename) {
    echo $filename.'<br/>';
}
?>
É fácil... terminar
 4
Author: pooya laryan, 2013-08-22 12:05:48

Se usar vários campos de entrada, poderá definir o nome= "ficheiro []" (ou qualquer outro nome). Isso irá colocá-los em um array quando você carregá-los ($_FILES['file'] = array ({file_array},{file_array]..))

 1
Author: Torandi, 2009-07-24 01:45:17

Há mais um Uploader baseado em Flash que é livre, Uploadify.

Holger - Amidalla Motor De Busca

 1
Author: Holger Deschakovski, 2011-04-18 14:02:46
<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>

A utilizar para o Loop

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

    }               
  }    
?>

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

    }               
  }
?>
 1
Author: antelove, 2017-11-18 11:21:28

Criei uma função php que é usada para enviar várias imagens, esta função pode enviar várias imagens em pasta específica, bem como pode gravar os registos na base de dados no seguinte código: $arrayimage é o conjunto de imagens que é enviado através do formulário lembre-se que ele não permitirá o upload usar vários, mas você precisa criar um campo de entrada diferente com o mesmo nome que você pode definir campo de adicionar dinâmico de arquivos não entrados no botão clique.

$dir é a pasta em que deseja gravar a imagem $fields é o nome do campo que deseja guardar na base de dados

O campo da Base de dados deve estar em formato de lista exemplo se você tiver imagestore de base de dados e campos Nome como id, nome, endereço então você precisa postar dados como

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

E depois passar esse campo para a função $fields

$Table é o nome da tabela na qual você deseja armazenar os dados..
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 classe termina aqui

Pode tentar este código. para inserir várias imagens com a sua extensão, esta função é criada para verificar os ficheiros de imagens, podendo substituir a lista de extensões dos ficheiros periculares no código
 0
Author: Prateik Darji, 2014-08-11 06:51:07

Resposta parcial: a pear HTTP_ Upload pode ser útil http://pear.php.net/manual/en/package.http.http-upload.examples.php

Existe um exemplo completo para vários ficheiros

 -1
Author: damko, 2009-07-24 01:17:25