Carga de varios archivos en php

122

Quiero cargar varios archivos y almacenarlos en una carpeta y obtener la ruta y almacenarla en la base de datos ... Cualquier buen ejemplo que buscaste para cargar varios archivos ...

Nota: Los archivos pueden ser de cualquier tipo ...

udaya
fuente
2
Aquí hay un buen ejemplo a seguir: EJEMPLO
jini
@sarfraz tuve fin de semana ... Justo ahora probé el ejemplo, es increíble, tan fácil
udaya
@sarfraz Traté de generar el <td> <input name = "ufile []" type = "file" id = "ufile []" size = "50" /> </td> a partir de un clic para agregar, obtuve el < td> está en agregar clic, pero el resultado no se logra ¿Pueden ver mi nueva pregunta publicada
udaya

Respuestas:

260

Sé que esta es una publicación antigua, pero una explicación más detallada podría ser útil para alguien que intente cargar varios archivos ... Esto es lo que debe hacer:

  • El nombre de entrada debe definirse como una matriz, es decir name="inputName[]"
  • El elemento de entrada debe tener multiple="multiple"o simplementemultiple
  • En su archivo PHP use la sintaxis "$_FILES['inputName']['param'][index]"
  • Asegúrese de buscar nombres y rutas de archivo vacíos , la matriz puede contener cadenas vacías . Usar array_filter()antes de contar.

Aquí hay un ejemplo malo y sucio (que muestra solo el 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 esto te ayude!

Andy Braham
fuente
1
No estoy seguro de que <input type="file">permita el atributo multiple, ¿cuál sería el resultado esperado? ¿El navegador permite seleccionar varios archivos?
Sven
9
@Sven Sí, es compatible con HTML5 , mira este enlace , mi mal aspecto es que IE no es compatible con esto, aunque ... Dios, nuestra vida sería mucho más fácil si todos siguieran los estándares ... LOL
Andy Braham
7
@AndyBraham El multipleatributo del elemento de entrada es booleano, lo que significa que no le proporciona un valor: <input name="upload[]" type="file" multiple /> consulte la especificación HTML5: w3.org/TR/2011/WD-html5-20110525/…
Rob Johansen
11
Vale la pena mencionar que el usuario debe seleccionar todos los archivos a la vez. Cualquier otro intento de selección cancelará la selección anterior.
Skippy le Grand Gourou
2
@AlienBishop no es del todo correcto aquí, multiple = "multiple" está perfectamente bien y se incluye en las especificaciones como alternativa.
kojow7
38

Se pueden seleccionar varios archivos y luego cargarlos usando el
<input type='file' name='file[]' multiple>
script php de muestra que realiza la carga:

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

Los archivos seleccionados se reciben como una matriz con

$_FILES['file']['name'][0]almacenando el nombre del primer archivo.
$_FILES['file']['name'][1]almacenando el nombre del segundo archivo.
y así.

rjv
fuente
¿Hay alguna forma de acceder a las rutas de archivo de cada archivo con JS al cargar varios archivos? por ejemplo, para archivos individuales, simplemente puede consultar fileInput.value, pero he notado que cuando se seleccionan varios archivos fileInput.value todavía solo genera una ruta ...
oldboy
6

HTML

  1. crear div con id='dvFile';

  2. crear un button;

  3. onclick de esa función de llamada de botón 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 
}

De esta manera, puede agregar archivos / imágenes, tantos como sea necesario, y manejarlos a través del script php.

kdniazi
fuente
1
Reemplace este document.getElementById ("dvFile"). InnerHTML + = txt; con $ ("#dvFile") .append (txt); guardará su archivo adjunto
Rahul rajoria
Esta respuesta es obsolote (y demasiado complicada para algo tan simple, en mi opinión). Para obtener una respuesta correcta, mire @ rjv's
Vladimir Nul
@VladimirNul, ¿hay alguna forma de acceder a las rutas de archivo de cada archivo con JS al cargar varios archivos? por ejemplo, para archivos individuales simplemente puede consultar fileInput.value, pero he notado que cuando se seleccionan varios archivos, fileInput.valuesolo se genera una ruta ...
oldboy
@Anthony, parece que lo estás haciendo en javascript, no veo el sentido. Por favor verifique la respuesta de rjv.
Vladimir Nul
5

No es tan diferente de cargar un archivo: $_FILESes una matriz que contiene todos los archivos cargados.

Hay un capítulo en el manual de PHP: Carga de varios archivos

Si desea habilitar la carga de varios archivos con una fácil selección por parte del usuario (seleccionando varios archivos a la vez en lugar de completar los campos de carga), eche un vistazo a SWFUpload . Sin embargo, funciona de manera diferente a un formulario de carga de archivos normal y requiere Flash para funcionar. SWFUpload quedó obsoleto junto con Flash. Verifique las otras respuestas más nuevas para el enfoque ahora correcto.

Pekka
fuente
1
Esta respuesta es obsolote. Para obtener una respuesta correcta, consulte @ rjv's
Vladimir Nul
Cierto. Editado para reflejar eso.
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
fuente
Esta respuesta es obsolote. Para obtener una respuesta correcta, consulte @ rjv's
Vladimir Nul
4

Simple es que, solo cuente la matriz de archivos primero, luego en el bucle while puede hacer esto fácilmente como

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

ahora tienes el número total de archivos correcto.

En el bucle while hacer así:

$i = 0;
while($i<$count)
{
    Upload one by one like we do normally
    $i++;
}
Mella
fuente
1
Aquí falta algo, eche un vistazo a la respuesta de @ rjv.
Vladimir Nul
4

este sencillo guión funcionó para mí.

<?php

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

?>
Rohit Mandiwal
fuente
3

Aquí hay una función que escribí que devuelve una $_FILESmatriz más comprensible .

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

Ejecuto foreach loop con elemento de error, 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";
    }   

 }
VHC
fuente
0

Podemos cargar fácilmente múltiples archivos usando php usando el siguiente script.

Descargue el código fuente completo y la vista previa

<?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
fuente
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
fuente
1
Verifique esta URL , será útil para mejorar la calidad de su contenido
Willie Cheng
0

Esto es lo que funcionó para mí. Tuve que cargar archivos, almacenar nombres de archivos y también tuve información adicional de los campos de entrada para almacenar y un registro por varios nombres de archivo. Usé serialize () y luego lo agregué a la 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
fuente
-1

Buen enlace en:

Carga de un solo archivo PHP con una explicación básica variada .

Carga de archivos PHP con Validación

Carga de archivos múltiples PHP con validación Haga clic aquí para descargar el código fuente

Carga de varios archivos PHP / jQuery con ProgressBar y validación (haga clic aquí para descargar el código fuente)

Cómo cargar archivos en PHP y almacenarlos en la base de datos MySql (haga clic aquí para descargar el código fuente)

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

y debes verificar tu 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>

Buen enlace en:

Carga de un solo archivo PHP con una explicación básica variada .

Carga de archivos PHP con Validación

Carga de archivos múltiples PHP con validación Haga clic aquí para descargar el código fuente

Carga de varios archivos PHP / jQuery con ProgressBar y validación (haga clic aquí para descargar el código fuente)

Cómo cargar archivos en PHP y almacenarlos en la base de datos MySql (haga clic aquí para descargar el código fuente)

Kalpesh Rajai
fuente