Upload de vários arquivos em php

122

Quero fazer upload de vários arquivos e armazená-los em uma pasta e obter o caminho e armazená-lo no banco de dados ... Qualquer bom exemplo que você procurou fazendo upload de vários arquivos ...

Nota: Os arquivos podem ser de qualquer tipo ...

udaya
fonte
2
Aqui está um bom exemplo para você seguir: EXEMPLO
jini
@sarfraz Eu tive o fim de semana ... Agora mesmo eu tentei o exemplo é incrível tão fácil
udaya
@sarfraz, tentei gerar o <td> <input name = "ufile []" type = "file" id = "ufile []" size = "50" /> </td> de um clique de adição, obtive o < td> está em adicionar clique, mas o resultado não foi alcançado Você pode ver minha nova pergunta postada
udaya

Respostas:

260

Eu sei que esta é uma postagem antiga, mas alguma explicação adicional pode ser útil para alguém que está tentando fazer upload de vários arquivos ... Aqui está o que você precisa fazer:

  • O nome da entrada deve ser definido como uma matriz, ou seja name="inputName[]"
  • O elemento de entrada deve ter multiple="multiple" ou apenasmultiple
  • Em seu arquivo PHP, use a sintaxe "$_FILES['inputName']['param'][index]"
  • Certifique-se de procurar nomes de arquivo e caminhos vazios , a matriz pode conter strings vazias . Use array_filter()antes de contar.

Aqui está um exemplo simples e sujo (mostrando apenas o código relevante)

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

    }
  }
}

Espero que isso ajude!

Andy Braham
fonte
1
Não tenho certeza se <input type="file">permite o atributo multiple- qual seria o resultado esperado? O navegador permite que vários arquivos sejam selecionados?
Sven,
9
@Sven Sim, é compatível com HTML5, verifique este link , mas parece que o IE não suporta isso ... Nossa, nossa vida seria muito mais fácil se todos seguissem os padrões ... LOL
Andy Braham
7
@AndyBraham O multipleatributo do elemento de entrada é booleano, o que significa que você não fornece a ele um valor: <input name="upload[]" type="file" multiple /> Consulte a especificação HTML5: w3.org/TR/2011/WD-html5-20110525/…
Rob Johansen
11
Vale ressaltar que o usuário deve selecionar todos os arquivos de uma vez. Qualquer outra tentativa de seleção cancelará a seleção anterior.
Skippy le Grand Gourou
2
@AlienBishop não está totalmente correto aqui, multiple = "multiple" é perfeitamente adequado e está incluído nas especificações como alternativa.
kojow7,
38

Vários arquivos podem ser selecionados e carregados usando o
<input type='file' name='file[]' multiple>
script php de amostra que faz o upload:

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

Os arquivos selecionados são recebidos como uma matriz com

$_FILES['file']['name'][0]armazenar o nome do primeiro arquivo.
$_FILES['file']['name'][1]armazenar o nome do segundo arquivo.
e assim por diante.

rjv
fonte
existe alguma maneira de acessar os caminhos de arquivo de cada arquivo com JS ao enviar vários arquivos? por exemplo, para arquivos individuais, você pode simplesmente consultar fileInput.value, mas notei que quando vários arquivos são selecionados, fileInput.value ainda exibe apenas um caminho ...
oldboy
6

HTML

  1. criar div com id='dvFile';

  2. criar um button;

  3. onclick dessa função de chamada de botão 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 
}

Desta forma, você pode adicionar arquivos / imagens, quantos forem necessários, e manipulá-los por meio de script php.

kdniazi
fonte
1
Substitua este document.getElementById ("dvFile"). InnerHTML + = txt; com $ ("#dvFile") .append (txt); isso salvará seu anexo
Rahul rajoria
Essa resposta é obsoleta (e muito complicada para algo tão simples, na minha opinião). Para uma resposta correta, dê uma olhada em @rjv's
Vladimir Nul
@VladimirNul existe alguma maneira de acessar os caminhos de cada arquivo com JS ao enviar vários arquivos? por exemplo, para arquivos individuais, você pode simplesmente consultar fileInput.value, mas percebi que, quando vários arquivos são selecionados, a fileInput.valuesaída é apenas um caminho ...
oldboy
@Anthony, parece que você está fazendo isso em javascript, não vejo o ponto. Verifique a resposta de rjv.
Vladimir Nul
5

Não é tão diferente de enviar um arquivo - $_FILES é uma matriz que contém todos os arquivos carregados.

Há um capítulo no manual do PHP: Upload de vários arquivos

Se você deseja habilitar múltiplos uploads de arquivos com fácil seleção por parte do usuário (selecionando vários arquivos de uma vez em vez de preencher os campos de upload), dê uma olhada em SWFUpload . Ele funciona de maneira diferente de um formulário normal de upload de arquivo e requer Flash para funcionar. SWFUpload estava obsoleto junto com o Flash. Verifique as outras respostas mais recentes para a abordagem agora correta.

Pekka
fonte
1
Essa resposta é obsoleta. Para uma resposta correta, dê uma olhada em @rjv's
Vladimir Nul
Verdade. Editado para refletir isso.
Pekka,
4
<!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>
muaz khalid
fonte
Essa resposta é obsoleta. Para uma resposta correta, dê uma olhada em @rjv's
Vladimir Nul
4

Simples é que, apenas conte a matriz de arquivos primeiro, então no loop while você pode facilmente fazer isso como

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

agora você acertou o número total de arquivos.

No loop while faça assim:

$i = 0;
while($i<$count)
{
    Upload one by one like we do normally
    $i++;
}
usuario
fonte
1
Há algo faltando aqui, por favor, dê uma olhada na resposta de @rjv.
Vladimir Nul
4

este script simples funcionou para mim.

<?php

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

?>
Rohit Mandiwal
fonte
3

Aqui está uma função que escrevi que retorna um $_FILESarray mais compreensível .

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;
}
Cheejyg
fonte
2

Eu executo o loop foreach com elemento de erro, parece

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

 }
HCV
fonte
0

Podemos facilmente fazer upload de vários arquivos usando php usando o script abaixo.

Baixe o código-fonte completo e visualize-o

<?php
if (isset($_POST['submit'])) {
    $j = 0; //Variable for indexing uploaded image 

 $target_path = "uploads/"; //Declaring Path for uploaded images
    for ($i = 0; $i < count($_FILES['file']['name']); $i++) {//loop to get individual element from the array

        $validextensions = array("jpeg", "jpg", "png");  //Extensions which are allowed
        $ext = explode('.', basename($_FILES['file']['name'][$i]));//explode file name from dot(.) 
        $file_extension = end($ext); //store extensions in the variable

  $target_path = $target_path . md5(uniqid()) . "." . $ext[count($ext) - 1];//set the target path with a new name of image
        $j = $j + 1;//increment the number of uploaded images according to the files in array       

   if (($_FILES["file"]["size"][$i] < 100000) //Approx. 100kb files can be uploaded.
                && in_array($file_extension, $validextensions)) {
            if (move_uploaded_file($_FILES['file']['tmp_name'][$i], $target_path)) {//if file moved to uploads folder
                echo $j. ').<span id="noerror">Image uploaded successfully!.</span><br/><br/>';
            } else {//if file was not moved.
                echo $j. ').<span id="error">please try again!.</span><br/><br/>';
            }
        } else {//if file size and file type was incorrect.
            echo $j. ').<span id="error">***Invalid file Size or Type***</span><br/><br/>';
        }
    }
}
?>
Merbin Joe
fonte
0
$property_images = $_FILES['property_images']['name'];
    if(!empty($property_images))
    {
        for($up=0;$up<count($property_images);$up++)
        {
            move_uploaded_file($_FILES['property_images']['tmp_name'][$up],'../images/property_images/'.$_FILES['property_images']['name'][$up]);
        }
    }
Vishnu Bhadoriya
fonte
1
Verifique este URL, pois será útil para aumentar a qualidade do seu conteúdo
Willie Cheng
0

Isto é o que funcionou para mim. Tive que fazer upload de arquivos, armazenar nomes de arquivos e informações adicionais de campos de entrada para armazenar também e um registro para vários nomes de arquivo. Usei serialize () e o adicionei à consulta sql principal.

  class addReminder extends dbconn {
    public function addNewReminder(){

           $this->exdate = $_POST['exdate'];
           $this->name = $_POST['name'];
           $this->category = $_POST['category'];
           $this->location = $_POST['location'];
           $this->notes = $_POST['notes'];



           try {

                     if(isset($_POST['submit'])){
                       $total = count($_FILES['fileUpload']['tmp_name']);
                       for($i=0;$i<$total;$i++){
                         $fileName = $_FILES['fileUpload']['name'][$i];
                         $ext = pathinfo($fileName, PATHINFO_EXTENSION);
                         $newFileName = md5(uniqid());
                         $fileDest = 'filesUploaded/'.$newFileName.'.'.$ext;
                         $justFileName = $newFileName.'.'.$ext;
                         if($ext === 'pdf' || 'jpeg' || 'JPG'){
                             move_uploaded_file($_FILES['fileUpload']['tmp_name'][$i], $fileDest);
                             $this->fileName = array($justFileName);
                             $this->encodedFileNames = serialize($this->fileName);
                             var_dump($this->encodedFileNames);
                         }else{
                           echo $fileName . ' Could not be uploaded. Pdfs and jpegs only please';
                         }
                       }

                    $sql = "INSERT INTO reminders (exdate, name, category, location, fileUpload, notes) VALUES (:exdate,:name,:category,:location,:fileName,:notes)";
                    $stmt = $this->connect()->prepare($sql);
                    $stmt->bindParam(':exdate', $this->exdate);
                    $stmt->bindParam(':name', $this->name);
                    $stmt->bindParam(':category', $this->category);
                    $stmt->bindParam(':location', $this->location);
                    $stmt->bindParam(':fileName', $this->encodedFileNames);
                    $stmt->bindParam(':notes', $this->notes);
                    $stmt->execute();
                  }

           }catch(PDOException $e){
             echo $e->getMessage();
           }
      }
    }
Adam Falchetta
fonte
-1

Belo link em:

Upload de arquivo único PHP com várias explicações básicas .

Upload de arquivo PHP com o Validation

Upload de vários arquivos PHP com validação Clique aqui para baixar o código-fonte

Upload de vários arquivos PHP / jQuery com ProgressBar e validação (clique aqui para baixar o código-fonte)

Como fazer upload de arquivos em PHP e armazená-los no banco de dados MySql (clique aqui para baixar o código-fonte)

extract($_POST);
    $error=array();
    $extension=array("jpeg","jpg","png","gif");
    foreach($_FILES["files"]["tmp_name"] as $key=>$tmp_name)
            {
                $file_name=$_FILES["files"]["name"][$key];
                $file_tmp=$_FILES["files"]["tmp_name"][$key];
                $ext=pathinfo($file_name,PATHINFO_EXTENSION);
                if(in_array($ext,$extension))
                {
                    if(!file_exists("photo_gallery/".$txtGalleryName."/".$file_name))
                    {
                        move_uploaded_file($file_tmp=$_FILES["files"]["tmp_name"][$key],"photo_gallery/".$txtGalleryName."/".$file_name);
                    }
                    else
                    {
                        $filename=basename($file_name,$ext);
                        $newFileName=$filename.time().".".$ext;
                        move_uploaded_file($file_tmp=$_FILES["files"]["tmp_name"][$key],"photo_gallery/".$txtGalleryName."/".$newFileName);
                    }
                }
                else
                {
                    array_push($error,"$file_name, ");
                }
            }

e você deve verificar o seu código HTML

<form action="create_photo_gallery.php" method="post" enctype="multipart/form-data">
    <table width="100%">
        <tr>
            <td>Select Photo (one or multiple):</td>
            <td><input type="file" name="files[]" multiple/></td>
        </tr>
        <tr>
            <td colspan="2" align="center">Note: Supported image format: .jpeg, .jpg, .png, .gif</td>
        </tr>
        <tr>
            <td colspan="2" align="center"><input type="submit" value="Create Gallery" id="selectedButton"/></td>
        </tr>
    </table>
</form>

Belo link em:

Upload de arquivo único PHP com várias explicações básicas .

Upload de arquivo PHP com o Validation

Upload de vários arquivos PHP com validação Clique aqui para baixar o código-fonte

Upload de vários arquivos PHP / jQuery com ProgressBar e validação (clique aqui para baixar o código-fonte)

Como fazer upload de arquivos em PHP e armazená-los no banco de dados MySql (clique aqui para baixar o código-fonte)

Kalpesh Rajai
fonte